文章目录
- 常用校验工具包
- 1、package javax.validation.constraints 包
- 2、package org.hibernate.validator.constraints;包
- 校验注解的使用步骤
- 1、Bean添加校验注解、自定义message提示
- 2、controller使用@valid开启校验
- 2.1 使用BindingResult 获取校验信息 手动封装校验返回数据
- 3、抽取校验异常 统一处理
- 4、分组异常校验(新增、修改等多场景复杂校验)
- 4.1、定义不同分组
- 4.2 controller注解 @valid 换为 @validated 指定需要校验的分组
- 5、自定义校验注解
常用校验工具包
1、package javax.validation.constraints 包
@null 验证对象是否为空
@notnull 验证对象是否为非空
@asserttrue 验证 boolean 对象是否为 true
@assertfalse 验证 boolean 对象是否为 false
@min 验证 number 和 string 对象是否大等于指定的值
@max 验证 number 和 string 对象是否小等于指定的值
@decimalmin 验证 number 和 string 对象是否大等于指定的值,小数存在精度
@decimalmax 验证 number 和 string 对象是否小等于指定的值,小数存在精度
@size 验证对象(array,collection,map,string)长度是否在给定的范围之内
@digits 验证 number 和 string 的构成是否合法
@past 验证 date 和 calendar 对象是否在当前时间之前
@future 验证 date 和 calendar 对象是否在当前时间之后
@pattern 验证 string 对象是否符合正则表达式的规则
@Email 验证邮箱
示例:
// @size (min=3, max=20, message="用户名长度只能在3-20之间")
// @size (min=6, max=20, message="密码长度只能在6-20之间")
// @pattern (regexp="[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\\.[a-za-z]{2,4}", message="邮件格式错误")
// @Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")
// @Email(message = "比如输入正确的邮箱")
// @NotNull(message = "用户名称不能为空")
// @Max(value = 100, message = "年龄不能大于100岁")
// @Min(value= 18 ,message= "必须年满18岁!" )
// @AssertTrue(message = "bln4 must is true")
// @AssertFalse(message = "blnf must is falase")
// @DecimalMax(value="100",message="decim最大值是100")
// DecimalMin(value="100",message="decim最小值是100")
// @NotNull(message = "身份证不能为空")
// @Pattern(regexp="^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message="身份证格式错误")
2、package org.hibernate.validator.constraints;包
校验注解的使用步骤
1、Bean添加校验注解、自定义message提示
@NotEmopty(message = "名称不能为空")
private String name;
2、controller使用@valid开启校验
@PostMapping("/save")
public R save(@valid @RequestBody BrandEntity brandEntity){
}
直接开启校验 数据格式错误返回信息如下
2.1 使用BindingResult 获取校验信息 手动封装校验返回数据
紧跟校验对象后面添加 BindingResult 对象,获取校验结果
3、抽取校验异常 统一处理
需要校验的每一个controller都写上述处理,很麻烦,使用springMVC 提供的 @controllerAdvice 统一处理异常
1、controller抛出异常
校验对象后不需要追加 BindingResult 对象
2、编写统一异常处理类
可以指定异常处理的controller包路径
可以根据不同的异常,编写不同的异常处理方法
@RestControllerAdvice(basePackages = "com.quella.gulimall.product.controller")
public class ExceptionController{
// 数据校验异常
@ExceptionHandler(value = {MethodArgumentNotValidException.class} )
public R handlevalidException(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
Map<String,String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach( item -> {
errorMap.put(item.getField(),item.getDefaultMessage());
} );
return R.error(400,"数据校验异常").put("data",errorMap);
}
}
4、分组异常校验(新增、修改等多场景复杂校验)
4.1、定义不同分组
创建分组接口 , 在字段使用分组校验groups 接受一个数组 : 数组里面的对象必须是接口 我们可以定义一个空接口
public interface addGroup{ }
public interface updateGroup{ }
4.2 controller注解 @valid 换为 @validated 指定需要校验的分组
@PostMapping("/save")
public R save(@validated({addGroup.class}) @RequestBody BrandEntity brandEntity){
}
5、自定义校验注解
1 编写自定义校验注解
@Documented // 表明这个注解被javadoc管理
@Constraint(validatedBy = ListValueConstraintValidator.class) //指定注解校验器
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) // 指定注解使用的地方
@Retention(RUNTIME) // 指定注解的运行环境
public @interface ListValue{
String message() default "数据不合法";
Class<?>[] groups() default { }; //支持分组
Class<? extends Payload>[] payload() default { };
int[] values() default {};
}
2 编写自定义的校验器
/**
* 自定义注解校验器
* @author admin
* @date 2020/7/8 1:02
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer>{
private List<Integer> list = new ArrayList<>();
/**
* 初始化方法 可以获取需要校验的注解的定义信息
* @param constraintAnnotation
*/
@Override
public void initialize (ListValue constraintAnnotation){
int[] values = constraintAnnotation.values();
list = Arrays.stream(values).boxed().collect(Collectors.toList());
}
/**
* 校验
* @param value 本次校验的值 注解标注的属性对应的值
* @param context 上下文环境
* @return
*/
@Override
public boolean isValid (Integer value,ConstraintValidatorContext context){
return (list.contains(value)) ? true : false;
}
}
3 两者建立关联
@Constraint(validatedBy = ListValueConstraintValidator.class)
如果自定义的注解的值种类很多 有Integer Double等 可以定义多个校验器针对不同的类型进行校验
@Constraint(validatedBy ={ ListValueConstraintValidatorForInteger.class, ListValueConstraintValidatorForDouble.class})