JSR303后端校验之使用的三种方法

1.引入

由于前端传参常常需要校验,比如邮箱的格式,于是诞生JSR303规则;

2.使用

能使用的校验注解:
1.Hibernate org.hibernate.validator.constrains 里面有的
2.Jsr303规定的 javax.validation.constraints
@pattern(regexp="")正则表达式

步骤:
1.javabean上注解

Class User{
@Email(message ="邮箱格式不正确")
private String email;
@NotBlank
@Length(min=6,max=18,message="用户名长度必须6-18位")
private String username;
}

2.告诉springboot这个需要校验@Valid

@PostMapping("/user")
public String ControllerTest(@Valid @RequestBody User user){
//1.如果不满足校验,会抛出异常;但项目规范有自定义异常,而自动抛出的异常不符合前端处理规范。
}

@PostMapping("/user")
public String ControllerTest(@Valid @RequestBody User user,BindingResult res){
//2.后面绑定后则不再抛出异常,而是把结果存在res,程序正常执行
	int errorCount = res.getErrorCount();//获取错误个数
	if(errorCount >0){
		List<FieldError> fieldErrors = res.getFieldErrors();
		fieldErrors.forEach((fieldError)->{
			String field = fieldError.getField();//属性
			fieldError.getRejectedValue;//获取出错的值
			fieldError.getDefaultMessage();//获取提示消息
	});
	return new Response().Failed(res);
	}else{
	}
}

3.由于每个controller都需要校验,为了统一校验,利用aop来实现Jsr303

通知:
前置通知:方法执行之前触发
后置通知:方法执行之后触发
返回通知:方法正常返回之后触发
异常通知:方法出现异常触发

正常执行: 前置通知==>返回通知==>后置通知
异常执行: 前置通知==>异常通知==>后置通知

环绕通知:4合一

//1.springboot引入aop的包
//1.切面  2.切入点  3.切入点表达式(* com.jd.mall.admin..*Controller.*(..))任意返回值,admin包下的.任意包,Controller结尾的任意类,*任意方法的(..)任意参数
@Aspect
@Component
public class DataVaildAspect{
//环绕通知
	@Around("execution(* com.jd.mall.admin..*Controller.*(..))")
	public Object validAround(ProceedingJoinPoint point){
		Object proceed = null;
		try{
			
			Object[] args = point.getArgs();
			for(Object obj:args){
				if(obj instanceof BindingResult){
					BindingResult r = (BindingResult) obj;
					if(r.getErrorCount()>0){
						return new Response().Failed(r);
					}
				}
			}
			log.debug("前置通知。。。");
			proceed = point.proceed(point.getArgs());//执行目标方法
			log.debug("返回通知。。。");
		}catch(){
			log.debug("异常通知。。。");
		}finally{
			log.debug("后置通知。。。");
		}
		return proceed;//正常controller返回值
	}
}

你可能感兴趣的:(SpringBoot)