二维列表(List<List<X>>)的校验(@Valid)

Validation (@Valid) of two-dimensional list (List<List<X>>)

我有一个 class X:

class X {
    @NotNull
    @NotEmpty
    private final String name;

    @JsonValue
    public String name() {
        return name;
    }

    @JsonCreator
    public X(final String name) {
        this.name = name;
    }
}

在另一个 class 中,我有以下内容:

class Input {
    @Valid
    @JsonProperty("data")
    private List<List<X>> data;
}

我正在使用 Jersey 解析 JSON 输入文件并使用 Hibernate Validator 进行验证。似乎没有执行验证 - 接受了一个空字符串。

"data": [
  [
    ""
  ],
  [
    "name",
    "location"
  ]
]

Bean 验证不支持此用例。 List<List<X>> data; 上的 @Valid 注释将指示验证器迭代每个 List<X> 元素并检查其有效性。为此,将检查 class List 是否存在不存在的 bean 验证约束(您的约束在 X 上)。 @Valid 不是任何形式的递归。

解决方法是使用您自己的包装器 class 来托管 X 实例列表。在这个包装器 class 中,您可以用 @Valid 注释包装列表。

您可以编写自己的注释来检查项目顶部的二维列表:

https://github.com/jirutka/validator-collection

它展示了如何验证集合中的元素。它可能对您的情况有所帮助,因为 jsr303 和 jsr349 都不能让您开箱即用地进行验证