2013-02-09 78 views
1

我使用Hibernate Validator(HV)作爲我的JSR 303驗證器。然而,無論是在JSR 303還是在HV的擴展中,似乎都沒有任何註釋來指定像Map中必須存在的鍵或只驗證與鍵對應的Map值的約束。讓Hibernate Validator驗證Map的密鑰

我的用例是,只有在bean的某些其他屬性設置爲true時,才需要某些映射鍵具有有效值。目前,我使用了一個假的getter和一個@AssertTrue註解,但是我真的想要使這個更多的註釋爲基礎。

回答

1

似乎沒有任何註釋來指定必須存在於某個映射中的鍵的約束。

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
@Documented 
@Constraint(validatedBy = { ContainsKeyValidator.class }) 
public @interface ContainsKeys { 
    String message() default "{com.acme.ContainsKey.message}"; 
    Class<?>[] groups() default { }; 
    Class<? extends Payload>[] payload() default { }; 
    String[] value() default {}; 
} 

而且這樣的驗證:

public class ContainsKeysValidator implements ConstraintValidator<ContainsKeys, Map<?, ?>> { 

    String[] requiredKeys; 

    @Override 
    public void initialize(ContainsKeys constraintAnnotation) { 
     requiredKeys = constraintAnnotation.values(); 
    } 

    @Override 
    public boolean isValid(Map<?, ?> value, ConstraintValidatorContext context) { 
     if(value == null) { 
      return true; 
     } 

     for(String requiredKey : requiredKeys) { 
      if(value.containsKey(requiredKey)) { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

我的使用情況是需要一些地圖鍵具有有效

這可以通過實現custom constraint來解決只有當bean的某些其他屬性設置爲true時纔有效。

對於這個需求,你可以實現一個class-level約束,它允許在驗證器實現中訪問具有所有屬性的完整bean。

+2

我認爲你錯過了你的條件內的否定。 – whiskeysierra 2014-10-15 10:59:22