使用Hibernate Validator 5.2 +

时间:2016-05-13 06:44:34

标签: java java-8 hibernate-validator

我正在使用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();
}

2 个答案:

答案 0 :(得分:0)

目前不是。 Hibernate Validator目前不支持这种类型的嵌套解包。

答案 1 :(得分:0)

作为解决方法,您可以创建一个特定的集合类型Promotions,将其用作地图值而不是List<Promotion>