JSR-303:添加约束违规后,约束违规集中出现额外的空一个
JSR-303: after adding a constraint violation, additional empty one appears in constraint violations set
我有自定义约束:
@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"
我有一个 class,其中一个字段用 @CheckNumberValid
注释。验证完成后,我收到两条违反约束的消息:numParseError 和空消息。
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"
这是我在调试中看到的:
我是否以不正确的方式添加了约束冲突,或者它通常有什么问题?
你的好像不见了
context.disableDefaultConstraintViolation();
这可以防止使用来自约束注释的默认消息生成违规(在您的示例中是一个空字符串 String message() default ""
)。这就是为什么您会遇到两种违规行为——一种是自动生成的,另一种是通过调用上下文方法构建的。所以你的验证器实现应该看起来像这样:
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;
}
}
我有自定义约束:
@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"
我有一个 class,其中一个字段用 @CheckNumberValid
注释。验证完成后,我收到两条违反约束的消息:numParseError 和空消息。
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"
这是我在调试中看到的:
我是否以不正确的方式添加了约束冲突,或者它通常有什么问题?
你的好像不见了
context.disableDefaultConstraintViolation();
这可以防止使用来自约束注释的默认消息生成违规(在您的示例中是一个空字符串 String message() default ""
)。这就是为什么您会遇到两种违规行为——一种是自动生成的,另一种是通过调用上下文方法构建的。所以你的验证器实现应该看起来像这样:
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;
}
}