【问题标题】:Make Hibernate Validator validate a Map by key让 Hibernate Validator 按键验证 Map
【发布时间】:2013-02-09 16:57:11
【问题描述】:

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

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

【问题讨论】:

    标签: java hibernate-validator


    【解决方案1】:

    似乎没有任何注释来指定约束,例如 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。

    【讨论】:

    • 我认为你在你的条件中缺少一个否定。
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多