我正在使用Hibernate Validator 5.2,它支持Java 8 type_use注释。我希望能够在Map中验证List的内容 - 换句话说,我只是想让它级联并验证Maps和Lists的内容,无论它们是如何嵌套的。
一个简单的地图示例:
Map<String, List<Promotion>> promotionsByGroupName = ...;
我希望能够做到:
@Valid
Map<String, List<@Valid Promotion>> promotionsByGroupName = ...;
但是这不起作用,因为标准的@Valid注释不能放在该元素上。所以我创建了一个自定义注释,我可以放在那里:
@Valid
Map<String, List<@ValidPart Promotion>> promotionsByGroupName = ...;
但是,与@ValidPart关联的验证器永远不会被触发。
我设法得到的最接近的是将@ValidPart注释放在List上,如下所示:
@Valid
Map<String, @ValidPart List<Promotion>> promotionsByGroupName = ...;
...然后在相关的验证器中解包List以获取元素的验证(不幸的是,它涉及在ConstraintValidator中调用Validator并“重写”生成的ConstraintViolations)。
因此,我的问题是,有没有办法在不遍历List的情况下进行这些嵌套验证?这个生成的约束违规路径并不是我想要的,因为它们看起来像:
promotionsByGroupName[GroupName].[0].name cannot be null
而不是(Map键名和索引之间没有点):
promotionsByGroupName[GroupName][0].name cannot be null
[0]部分是List的索引,我在此代码中使用addPropertyName添加了自己:
for (ConstraintViolation<?> violation : validator.validate(value)) {
NodeBuilderCustomizableContext builder = context
.buildConstraintViolationWithTemplate(violation.getMessage())
.addPropertyNode("[" + i + "]");
for (String nodeName : violation.getPropertyPath().toString().split("\\.")) {
builder = builder.addPropertyNode(nodeName);
}
builder.addConstraintViolation();
}
答案 0 :(得分:0)
目前不是。 Hibernate Validator目前不支持这种类型的嵌套解包。
答案 1 :(得分:0)
作为解决方法,您可以创建一个特定的集合类型Promotions
,将其用作地图值而不是List<Promotion>
。