jdk 和 hibernate-validator 定义了很多校验的注解,但是毕竟这些都是提前定义好的,有时候并不能满足我们的校验需求,所以我们可以自定义校验注解和校验规则
1、jdk所提供的校验规则
2、hibernate-validator所提供的校验规则
校验注解
/**
* @Description : 自定义生日检验注解
* @Date: 2021/4/10 00:23
* @Author : tiankun
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Constraint(validatedBy = BirthdayValidatorClass.class)
public @interface BirthdayValidator {
String[] value() default {};
String message() default "日期是不能在 2000-01-01 之前";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
校验器
/**
* @Description : 生日检验器
* @Date: 2021/4/10 00:25
* @Author : tiankun
*/
public class BirthdayValidatorClass implements ConstraintValidator<BirthdayValidator, Date> {
@SneakyThrows
@Override
public boolean isValid(Date value, ConstraintValidatorContext context) {
/*
校验日期是否是在 2000-01-01 之前
*/
Date date = new SimpleDateFormat("YYYY-MM-dd").parse("2000-01-01");
return value.after(date);
}
}
测试使用
实体类
/**
* @Description : 用户实体类
* @Date: 2021/4/10 00:06
* @Author : tiankun
*/
@Data
public class User {
private Integer id;
private String name;
@BirthdayValidator
private Date birthday;
}
Controller
@PostMapping("/test")
public String test( @Validated @RequestBody User user){
System.out.println(user);
return "111";
}
全局处理器
/**
* @Description : 异常处理类
* @Date: 2021/4/10 08:56
* @Author : tiankun
*/
@RestControllerAdvice
@Slf4j
public class GlobolExceptionAddvice {
/**
* 校验异常处理 MethodArgumentNotValidException
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public String handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
FieldError fieldError = bindingResult.getFieldError();
log.info("出现了 MethodArgumentNotValidException 异常:"+fieldError.getDefaultMessage());
return null;
}
}
利用postman发送请求
控制台