如何验证地图中的集合
2022-09-03 15:07:11
我对JSR-303的注释有问题。注释适用于普通列表或和集,但我正在尝试验证包含列表的地图,即@Valid
@Valid
HashMap<String, ArrayList<Object1>> map;
在这种情况下,不会验证类的实例。有没有一种方便的方法来递归地执行此操作,而无需迭代每个对象并手动验证它?Object1
我对JSR-303的注释有问题。注释适用于普通列表或和集,但我正在尝试验证包含列表的地图,即@Valid
@Valid
HashMap<String, ArrayList<Object1>> map;
在这种情况下,不会验证类的实例。有没有一种方便的方法来递归地执行此操作,而无需迭代每个对象并手动验证它?Object1
当映射值本身是列表时,规范不指定验证行为。
来自 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;
}
}