JSR是什么
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,数据校验
JSR的实现
1.javax.validation.constraints内置的实现
@Null 对象必须为null
@NotNull 对象必须不为null,无法检查长度为0的字符串
@NotBlank 字符串必须不为Null,且去掉前后空格长度必须大于0
@AssertTrue 对象必须为true
@AssertFalse 对象必须为false
@Max(Value) 必须为数字,且小于或等于Value
@Min(Value) 必须为数字,且大于或等于Value
@DecimalMax(Value) 必须为数字( BigDecimal ),且小于或等于Value。小数存在精度
@DecimalMin(Value) 必须为数字( BigDecimal ),且大于或等于Value。小数存在精度
@Digits(integer,fraction) 必须为数字( BigDecimal ),integer整数精度,fraction小数精度
@Size(min,max) 对象(Array、Collection、Map、String)长度必须在给定范围
@Email 字符串必须是合法邮件地址
@Past Date和Calendar对象必须在当前时间之前
@Future Date和Calendar对象必须在当前时间之后
@Pattern(regexp=“正则”) String对象必须符合正则表达式
2. Hibernate Validator 附加的 constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空 ,非""[]
***元素只能是字符串,数组,map,list***
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
@URL 被注释的元素必须是url地址
3.所有注解的属性都有message出现异常,message记录异常消息,group..
有些注解还有其他适合他们的属性,如pattern(regexp="正则表达式")
jsr的使用步骤
1.在实体bean上的属性上加上这些校验注解
2.在接口方法处的 用于接收前端请求体数据的 实体类 前 加上@Validated注解,表示开启数据校验
jsr303数据校验出现异常的解决办法
1.在实体类后直接加上,@Validated({AddGroup.class}) @RequestBody BrandEntity brand,BindingResult result
这时如果出现异常,直接 BindingResult来处理(参照异常处理的几种方式),用一个map来接收BindingResult的错误结果list<FieldError>遍历这个list,
用我们准备的map存下,然后json返回前端
2.自己准备一个统一异常管理(常用)
然后在统一异常管理类中准备一个ExceptionHandler(value= MethodArgumentNotValidException.class)
来处理 数据校验异常,将异常出现后的逻辑全部写在其中,避免了在每个接口方法都得写异常处理的步骤
具体如下:
@ExceptionHandler(value= MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e){
log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map<String,String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError)->{
errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
});
return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap);
}
JSR的分组管理
1.@Validated(value{}) 和 校验注解的groups属性{} value和groups的类型都是class<T>[],class起到的作用就是来标注分组的
2.可以专门准备一个valid包来 存放校验分组的类(空接口,起标识作用)
3.value{}开启校验分组,里面的值表示哪些分组的校验注解可以生效,若为null,那么没有分组的校验注解生效
4.value{}数组里面的值是或关系,是指只有有里面一个分组,那么校验注解生效
5.没有标任何 group的字段,只有在 @Validated()(开启校验,没有指定任何group的字段 校验生效)
JSR自定义校验注解
1.首先自己定义检验注解,然后定义校验器(按什么规则进行检验的)
2.自定义校验注解:属性主要是message,groups,有的有value,regexp等
3.自定义校验器,主要是对检验规则进行定义,如果有value和regexp等值的话,
会对value..为基础来进行校验
4.例子@pattern(regexp=),进入校验器,校验规则是被注解的字符串,应该是按照regexp的规则的