gpt4 book ai didi

java - 让 Hibernate Validator 按键验证 Map

转载 作者:行者123 更新时间:2023-11-30 09:26:58 27 4
gpt4 key购买 nike

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

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

最佳答案

There does not seem to be any annotation to specify constraints like a key must exist in a 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 {};
}

像这样的 validator :

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

My use case is that some map keys are required to have valid values only if some other property of the bean is set to true.

对于此要求,您可以实现 class-level约束,它允许在 validator 实现中访问完整的 bean 及其所有属性。

关于java - 让 Hibernate Validator 按键验证 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14790420/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com