前言
JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。
此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
注:可以使用注解的方式进行验证
开启校验,使用@Valid,给校验的bean后面紧跟一个BindingResult,就可以获取到校验规则
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public R handlerValidException(MethodArgumentNotValidException e) {
// log.error("校验数据数据出现问题 {},异常类型 {}",e.getMessage(),e.getClass());
Map map = new HashMap();
e.getBindingResult().getFieldErrors().forEach(item -> {
String field = item.getField();
String message = item.getDefaultMessage();
map.put(field,message);
});
log.error("校验数据数据出现问题 {}",map);
return R.error(BizCodeEnum.VALID_EXCEPTION).put("data",map);
}
分组功能
- 创建几个用于标识的类只是用来标识,AddGroup.class,UpdateGroup.class
- @Pattern(regexp = "/^[a-zA-Z]$/",message = "检索首字母必须是一个字母",groups = {AddGroup.class,UpdateGroup.class}),给校验注解标注什么时候需要进行校验
- 使用
@Validated({AddGroup.class})
- 默认没有指定分组的校验注解,在分组使用
@Validated({AddGroup.class})下不生效
自定义校验
- 编写一个自定义的校验注解
- 编写一个自定义的校验器ConstraintValidator
- 关联自定义的校验器和自定义的校验注解
/**
自定义校验注解
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
//这里绑定自定义校验器
@Constraint(validatedBy = { ListValueConstraintValidtor.class})
public @interface ListValue {
String message() default "{com.atguigu.mall.common.valid.ListValue.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int[] vales();
}
/**
* @ClassName ListValueConstraintValidtor
* @Author HETAO
* @Date 2020/12/4 11:16
*/
//这里泛型,第一个参数代表自定义校验注解,第二个是校验的类型
public class ListValueConstraintValidtor implements ConstraintValidator<ListValue,Integer> {
private static IntStream result;
/**
* 校验逻辑
* @param value
* @param context
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return value != null && result.anyMatch(value1 -> value1 == value);
}
/**
* 初始化值
* @param constraintAnnotation
*/
@Override
public void initialize(ListValue constraintAnnotation) {
result = Arrays.stream(constraintAnnotation.vales());
}
}
ValidationMessages.properties,默认提示信息
评论区