2017-09-04 90 views
0

我有自定義的約束:JSR-303:添加一個約束衝突後,額外的空單出現在約束違規設置

@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" 

我有一個類與一個字段與註釋。驗證完成後,我得到兩條違反約束的消息: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" 

這是我在調試看到:

Multiple error for one violation

難道我不正確的方式還是什麼加約束衝突是不妥的一般?

回答

2

看來你缺少

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; 
     } 
    } 
+0

是的,這就是我真的錯過。謝謝。 – Dragon