文章目录

  • 常用校验工具包
  • 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;包

java 后端验证 Authorization java后端数据校验_校验器

校验注解的使用步骤

1、Bean添加校验注解、自定义message提示

@NotEmopty(message = "名称不能为空")
private String name;

2、controller使用@valid开启校验

@PostMapping("/save")
 public R save(@valid @RequestBody BrandEntity brandEntity){
 }
直接开启校验 数据格式错误返回信息如下

java 后端验证 Authorization java后端数据校验_自定义_02

2.1 使用BindingResult 获取校验信息 手动封装校验返回数据

紧跟校验对象后面添加 BindingResult 对象,获取校验结果

java 后端验证 Authorization java后端数据校验_自定义_03

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、定义不同分组
创建分组接口 , 在字段使用分组校验

java 后端验证 Authorization java后端数据校验_自定义_04

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})