首页 > 解决方案 > Spring - 在我自己的用于验证的注释中返回我的 onw 异常

问题描述

我有我的 onw 注释:

@Constraint(validatedBy = {MaxDateValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MaxDate {

和我的验证器:

@RequiredArgsConstructor
public class MaxDateValidator implements ConstraintValidator<MaxDate, LocalDate> {


    @Override
    public void initialize(MaxDate constraintAnnotation) {
        ...
    }

    @Override
    public boolean isValid(LocalDate date, ConstraintValidatorContext constraintValidatorContext) {
      //I want to throw my onw exception here with some hint to be read by 
      frontend
      if(condition){
         throw new MyException("message", HINTS.WRONG_DATE);
      }
      return someCondition();
    }
}

我的问题是是否可以在 isValid 方法中抛出我自己的异常?我在来自前端的 Dto 中的某个字段上设置了自己的注释 @MaxDate,在某些情况下,我想在这里抛出我自己的异常,并带有一些提示供前端读取并显示一些验证消息。

或者也许我应该完全删除这个注释并在我的服务方法中做一些验证?

标签: springvalidationspring-validator

解决方案


isValid方法中抛出你自己的异常不是一个好主意,因为按照约定,这个方法不应该抛出任何异常(顺便说一下应该是线程安全的)。要自定义此验证器引发的异常,您可以使用标准机制,例如:

  1. String message() default "your message";在 MaxDate 注释中添加字段。
  2. 像这样使用 ConstraintValidatorContext:
if(condition){
     context.disableDefaultConstraintViolation();
     context.buildConstraintViolationWithTemplate("Your message").addConstraintViolation();
     return false;
}

推荐阅读