SpringMVC 使用JSR-303进行校验

本文介绍如何在Spring MVC项目中实现数据校验,包括引入依赖、配置切面及Controller层注解应用,并提供ValidAspect类实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 共三个步骤:
一、pom.xm新增:
<!--使用JRS-303校验数据-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>

<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.1.1.GA</version>
</dependency>
二、配置切面编程Aspect
2.1新建切面处理类,见附件1:ValidAspect 类
2.2.springmvc-servlet.xml中添加如下:
<!--切面开启-->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
三、在controller层加入注释:如下
3.1参数加标记符如下:
/**
* Created by linzetian on 2016/11/10.
* Description:登录信息
*/
public classLogin {
@NotNull(message="登录名不能为空")
privateStringname;//登录名

@NotNull(message="密码不能为空")
privateStringpassword;//密码

publicStringgetName() {
returnname;
}

public void setName(String name) {
this.name= name;
}

publicStringgetPassword() {
returnpassword;
}

public void setPassword(String password) {
this.password= password;
}
}
3.2 在controller层加标记符如下:
@ResponseBody
publicResultlogin(@RequestBody @Valid Login bean,BindingResult result){
return new Result().success("操作成功");
}
注意:@Valid 注释表示要校验的参数,其后必须跟BindingResult变量



附件:
===============附件1ValidAspect 类
packagecom.tecsun.das.collect.common.aspect;

importcom.tecsun.das.collect.common.result.RESULT_CODES;
importcom.tecsun.das.collect.common.result.Result;
importcom.tecsun.das.collect.common.util.StringUtils;
importorg.aspectj.lang.ProceedingJoinPoint;
importorg.aspectj.lang.annotation.Around;
importorg.aspectj.lang.annotation.Aspect;
importorg.aspectj.lang.reflect.MethodSignature;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importorg.springframework.validation.BindingResult;
importorg.springframework.validation.ObjectError;

importjavax.validation.Valid;
importjavax.xml.validation.Validator;
importjava.lang.annotation.Annotation;
importjava.lang.reflect.Method;

/**
* Created by linzetian on 2016/11/10.
* Description:controller层校验切面类
*主要用户校验数据
*/
@Component
@Aspect
public classValidAspect {

/**
*ResponseBody标识的方法进入切面编程
*@parampjp
*@return
*@throwsThrowable
*/
@Around("@annotation(org.springframework.web.bind.annotation.ResponseBody)")
publicObjectdoValid(ProceedingJoinPoint pjp)throwsThrowable{
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
if(!Result.class.equals(method.getReturnType())){
pjp.proceed();
}
Object[] args = pjp.getArgs();
Annotation[][] annotations = method.getParameterAnnotations();
for(inti =0;i < annotations.length;i++){
if(!hasValidAnnotation(annotations[i])){
continue;
}
if(!(i < annotations.length-1&& args[i+1]instanceofBindingResult)){
//验证对象后面没有跟bindingResult,事实上如果没有应该到不了这一步
continue;
}
BindingResult result = (BindingResult) args[i+1];
Result rt = getError(result);
if(RESULT_CODES.FAILL.equals(rt.getStatusCode())){
returnrt;
}
}
returnpjp.proceed();
}

/**
*判断是否包含ValidValidated标签
*@paramannotations
*@return
*/
private booleanhasValidAnnotation(Annotation[] annotations){
if(annotations == null){
return false;
}
for(Annotation annotation : annotations){
if(annotationinstanceofValid
|| annotation instanceofValidated){
return true;
}
}
return false;
}

/**
*获取校验失败的错误信息
*@paramresult校验的结果
*@return校验通过“”校验失败:错误信息
*/
private staticResultgetError(BindingResult result){
try{
StringBuilder errorMg =newStringBuilder();
if(result.hasErrors()){
for(ObjectError error : result.getAllErrors()){
String fieldName = ((FieldError) error).getField();
errorMg.append(fieldName+error.getDefaultMessage()+",");
}
String errors = StringUtils.trimEnd(errorMg.toString(),",");
return newResult().fail(errors);
}
}catch(Exception e) {
e.printStackTrace();
}
return newResult().success("校验通过");
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值