使Hibernate Validator按键验证Map

时间:2013-02-09 16:57:12

标签: java hibernate-validator

我正在使用Hibernate Validator(HV)作为我的JSR 303验证器。但是,在JSR 303和HV的扩展中,似乎没有任何注释来指定约束,例如一个键必须存在于Map中,或者只验证与键对应的Map值。

我的用例是,只有当bean的某些其他属性设置为true时,才需要某些映射键具有有效值。目前,我使用了一个假冒的getter和一个@AssertTrue注释,但我真的想让它更基于注释。

1 个答案:

答案 0 :(得分:2)

  

似乎没有任何注释来指定约束,就像一个键必须存在于Map中。

这可以通过实施custom constraint

来解决
@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;
    }
}
  

我的用例是,只有当bean的某些其他属性设置为true时,才需要某些映射键具有有效值。

对于此要求,您可以实现class-level约束,该约束允许在验证器实现中访问包含其所有属性的完整bean。