@Target({ElementType.METHOD,ElementType.FIELD}) //注解作用域
@Retention(RetentionPolicy.RUNTIME) //注解作用时间
@Constraint(validatedBy = MyConstriantValidator.class) //执行校验逻辑的类
public @interface MyConstraint {
//校验不过时候的信息
String message() default "{org.hibernate.validator.constraints.NotBlank.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Slf4j
public class MyConstriantValidator implements ConstraintValidator<MyConstraint,Object> { //两个泛型分别为自定义注解和要校验的类型
@Autowired //可自由注入Spring工厂的bean
private HelloService helloService;
/**
* 初始化
* @param myConstraint
*/
@Override
public void initialize(MyConstraint myConstraint) {
log.info("my validator init");
}
/**
* 校验逻辑
* @param o //校验的参数
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
String value = helloService.sayHellp(o.toString());
log.info(value);
return false;
}
}
@MyConstraint(message = "这是一个测试")
private String username;
@PutMapping("/{id:\\d+}")
public User update(@RequestBody @Valid User user,
BindingResult errors){ //这里BindingResult参数必须紧跟被@Valid注解的参数
if(errors.hasErrors()){
errors.getAllErrors().stream().forEach(error -> {
// FieldError fieldError = (FieldError) error;
// String message = fieldError.getField()+" "+error.getDefaultMessage();
log.info(error.getDefaultMessage());
});
}
return user;
}
image.png
image.png