1、基本注解
JSR 提供的校验注解:
@Null
被注释的元素必须为 null@NotNull
被注释的元素必须不为 null@AssertTrue
被注释的元素必须为 true@AssertFalse
被注释的元素必须为 false@Min(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max=, min=)
被注释的元素的大小必须在指定的范围内@Digits (integer, fraction)
被注释的元素必须是一个数字,其值必须在可接受的最大小数的位数@Past
被注释的元素必须是一个过去的日期@Future
被注释的元素必须是一个将来的日期@Pattern(regex=,flag=)
被注释的元素必须符合指定的正则表达式
Hibernate Validator 提供的校验注解:
@NotBlank(message =)
验证字符串非 null,且长度必须大于 0@Email
被注释的元素必须是电子邮箱地址@Length(min=,max=)
被注释的字符串的大小必须在指定的范围内@NotEmpty
被注释的字符串的必须非空@Range(min=,max=,message=)
被注释的元素必须在合适的范围内
2、Spring Boot中使用
全局异常控制
/**
* 请求实体出现异常信息
* @param ex 异常
* @return 错误的字段可错误信息
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public String handleValidationExceptions(MethodArgumentNotValidException ex) {
StringBuilder sb = new StringBuilder();
ex.getBindingResult().getAllErrors().forEach(x -> {
/*key:错误的字段,value:错误的属性原因*/
sb.append("key:").append(((FieldError) x).getField()).append("\n");
sb.append("value:").append(x.getDefaultMessage()).append("\n");
});
return sb.toString();
}
/**
* 效验@requestParam的参数异常,非请求实体
* @param ex 异常
* @return 错误信息
*/
@ExceptionHandler(ConstraintViolationException.class)
public String ConstraintViolationExceptionHandler(ConstraintViolationException ex) {
return ex.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
}
直接效验:
1、类上添加注解
@Validated 不可少
@RequestMapping("/dl")
@RestController
@Validated //不可少
public class HelloController {
}
2、方法参数上使用
@RequestMapping("/dl")
@RestController
@Validated
public class HelloController {
/**
* 测试
* @return
*/
@GetMapping("/aa")
public String aa( @RequestParam("name") @NotBlank String name ) {
return "aa";
}
}
实体类中进行效验:
@Valid 属性为对象类型要进行效验,要添加Valid注解进行下钻
@Data
public class Student {
@Valid // 效验对象要使用Valid注解
private Student student;
@Max(value = 18)
private Integer age;
}
@RequestMapping("/dl")
@RestController
@Validated
public class HelloController {
/**
* 测试2
*
* @return @Valid注解
*/
@PostMapping("/aa")
public String aa( @RequestBody @Valid Student student) {
return "aa";
}
}
组效验不常用,用起来比较繁琐
自定义效验注解:
案例注解用于效验枚举值是否存在
1、注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER}) //用于属性和参数
@Constraint(validatedBy = EnumValidator.class) //EnumValidator 我们要实现的逻辑
@Documented
public @interface EnumValid {
//错误信息
String message() default "枚举值不存在";
//默认 不然会报错
Class<?>[] groups() default {};
//默认 不然会报错
Class<? extends Payload>[] payload() default {};
//枚举类的class
Class<? extends Enum<?>> enumClass();
}
2、编写 EnumValidator类,实现ConstraintValidator接口
public class EnumValidator implements ConstraintValidator<EnumValid, String> {
private Class<? extends Enum<?>> enumClass;
@Override
public void initialize(EnumValid constraintAnnotation) {
this.enumClass = constraintAnnotation.enumClass();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
/*效验规则*/
Enum<?>[] constants = enumClass.getEnumConstants();
for (Enum<?> item : constants) {
if (item.name().equals(value)) {
return true;
}
}
return false;
}
}
一个自定义注解就实现了。
项目中这些就基本够用。