gpt4 book ai didi

java - JSR303 验证组继承

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:52:43 25 4
gpt4 key购买 nike

给定以下类和接口(interface)

class A{
@NotNull(groups=Section1.class)
private String myString
}

interface All{}
interface Section1 extends All {}

调用时

A = new A();validator.validate(a,All.class);

我希望它应该是无效的,因为 myString 是 null 并且它是 notNull group extends All 但它不是。请注意,我正在使用 validator 的 Hibernate impl (4.0.2.GA)

最佳答案

您的期望与规范要求相悖。来自spec (PDF 的第 27 页):

For a given interface Z, constraints marked as belonging to the group Z (i.e. where the annotation element groups contains the interface Z) or any of the super interfaces of Z (inherited groups) are considered part of the group Z.

换句话说,如果您使用 Section1.class 进行验证并使用 All.class 标记 @NotNull,则将应用约束。但反之则不然。

将其视为一个集合:All 是一组通用的约束,通过扩展 AllSection1 成为一个 All 的超集,而不是子集。因此,当您使用 All 进行验证时,它仅应用 All 及其 super 接口(interface)指定的那些。

如果您希望All 成为Section1 中的约束的超集,您需要翻转继承:

interface All extends Section1 /*, Section2, Section3...*/ {}

从这个意义上说,您可以对自己说,All 继承 Section1 的所有约束。

这也是合理的实现,因为 Java 使得找出谁扩展了某个接口(interface)变得极其困难(毕竟,类文件在被引用之前甚至可能不可用),但是很容易看出接口(interface)是一个给定的接口(interface)扩展。

关于java - JSR303 验证组继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com