15

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

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

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

4

1 回答 1

13

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

来自JSR 303 规范

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

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

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

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

或者,您可以编写一个自定义验证器来处理您的复杂地图。像这样的东西:

@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;
   }
}
于 2012-05-23T15:22:38.350 回答