jsr-303:添加约束冲突后,约束冲突集中会出现额外的空约束冲突

wb1gzix0  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(356)

我有自定义约束:

@Target({FIELD, METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ConstraintComposition(CompositionType.AND)
@Constraint(validatedBy = {CheckNumberValidator.class})
public @interface CheckNumberValid {
    String message() default "";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

以及它的验证器( isValid 方法):

public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if(s.length() > 1 && s.length() < 3) {
            try {
                Integer integer = Integer.valueOf(s);
                if(something_wrong) {
                    constraintValidatorContext.buildConstraintViolationWithTemplate("{tooLargeNum}").addConstraintViolation();
                    return false;
                }
            } catch (Exception ex) {
                constraintValidatorContext.buildConstraintViolationWithTemplate("{numParseError}").addConstraintViolation();
                return false;
            }

        }
        return true;
    }

消息如下:

tooLargeNum="Too large num"
numParseError="Num parse error"

我有一个类,其中一个字段用 @CheckNumberValid . 验证完成后,我得到两个约束冲突消息:numparseerror和empty。

User number = new User("2d");

Set<ConstraintViolation<User>> constraintViolations = validator.validate(number);
for (ConstraintViolation<User> constraintViolation : constraintViolations) {
    System.out.println(constraintViolation.getMessage());
}

结果是:

/empty string/
"Num parse error"

下面是我在调试中看到的:

我是否以不正确的方式添加了约束冲突,或者它通常有什么问题?

px9o7tmv

px9o7tmv1#

你的眼睛好像不见了

context.disableDefaultConstraintViolation();

它防止从约束注解(在您的示例中是空字符串)生成带有默认消息的冲突 String message() default "" ). 这就是为什么会出现两个冲突——一个是自动生成的,另一个是通过调用context方法生成的。所以您的验证器实现应该如下所示:

class CheckNumberValidator implements ConstraintValidator<CheckNumberValid, String>{

         @Override
         public boolean isValid(String value, ConstraintValidatorContext context) {
             if(value.length() > 1 && value.length() < 3) {
                 try {
                     Integer integer = Integer.valueOf(value);
                     if(something_wrong) {
                         context.disableDefaultConstraintViolation();
                         context.buildConstraintViolationWithTemplate("{tooLargeNum}").addConstraintViolation();
                         return false;
                     }
                 } catch (Exception ex) {
                     context.disableDefaultConstraintViolation();
                     context.buildConstraintViolationWithTemplate("{numParseError}").addConstraintViolation();
                     return false;
                 }

             }
             return true;
         }
     }

相关问题