2013-02-09 79 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