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返回值
}
}