【问题标题】:Howto validate Collections in Maps如何验证地图中的集合
【发布时间】:2012-05-30 03:52:54
【问题描述】:

我对 JSR-303 的 @Valid 注释有疑问。 annotation 适用于普通列表或集合,但我正在尝试验证包含列表的地图,即

@Valid
HashMap<String, ArrayList<Object1>> map;

在这种情况下,Object1 类的实例不会被验证。有没有一种方便的方法可以递归地执行此操作,而无需遍历每个对象并手动验证它?

【问题讨论】:

    标签: java validation hibernate-validator


    【解决方案1】:

    当映射值本身是列表时,规范没有指定验证行为。

    来自JSR 303 specification

    迭代器提供的每个对象都经过验证。对于 Map,值 每个 Map.Entry 的验证(密钥未验证)。

    由于您的案例中的值是一个没有@Valid 注释的列表,因此它不会被处理。要解决此问题,您可以:

    将包含的列表包装在另一个 bean 中,强制对列表进行注释处理。

    public class ListHolder<T extends Iterable> {
        @Valid
        public T wrappedList;
    }
    

    或者您也可以写一个custom validator 来处理您的复杂地图。像这样的:

    @Target({ METHOD, FIELD, ANNOTATION_TYPE })
    @Retention(RUNTIME)
    @Documented
    @Constraint(validatedBy = ValidMapValidator.class)
    public @interface ValidMap {
       String message() default "valid.map";
    
       Class<?>[] groups() default {};
    
       Class<? extends Payload>[] payload() default {};
    }
    
    public class ValidMapValidator implements
          ConstraintValidator<ValidMap, Map<?, ?>> {
    
       @Override
       public void initialize(final ValidMap annotation) {
          return;
       }
    
       @Override
       public boolean isValid(final Map<?, ?> map,
             final ConstraintValidatorContext context) {
          if (map == null || map.size() == 0)
             return true;
    
          // Iterate each map entry and validate
          return true;
       }
    }
    

    【讨论】:

    • 是的,我尝试编写自定义验证器,但要验证实际对象,我需要知道类型。 Set> constraintViolations = validator.validate(car);
    • 您可以对泛型类型使用通配符。有关如何设置验证器的示例,请参阅我的答案的编辑。
    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多