给出以下类和接口
class A{
@NotNull(groups=Section1.class)
private String myString
}
interface All{}
interface Section1 extends All {}
致电
a a = new A(); validator.validate(一,All.class);
我希望它应该是无效的,因为myString为null并且它是notNull组扩展All但它没有。请注意,我正在使用验证器
的Hibernate impl(4.0.2.GA)答案 0 :(得分:6)
您的期望与规范要求相反。从spec(PDF上的第27页):
对于给定的接口Z,标记为属于组Z的约束(即,注释元素组包含接口Z的位置)或Z的任何超级接口(继承的组)被认为是组Z的一部分。 / p>
换句话说,如果您使用Section1.class
进行了验证并使用@NotNull
标记了All.class
,则会应用约束。但不是相反。
将其视为一组:All
是一组常见的约束,通过扩展All
,Section1
成为{{1}的超集不是一个子集。因此,当您使用All
进行验证时,它仅应用All
及其超级接口指定的那些。
如果您希望All
成为All
中找到的约束的超集,则需要翻转继承:
Section1
从这个意义上讲,您可以对自己说interface All extends Section1 /*, Section2, Section3...*/ {}
继承 All
的所有约束。
这也是合理的实现,因为Java使得查找谁扩展某个接口非常困难(毕竟,类文件在被引用之前可能甚至不可用),但是很容易看到接口是给定的接口扩展。