JSR303验证组继承

时间:2012-03-19 17:40:41

标签: java bean-validation

给出以下类和接口

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)

1 个答案:

答案 0 :(得分:6)

您的期望与规范要求相反。从spec(PDF上的第27页):

  

对于给定的接口Z,标记为属于组Z的约束(即,注释元素组包含接口Z的位置)或Z的任何超级接口(继承的组)被认为是组Z的一部分。 / p>

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

将其视为一组:All是一组常见的约束,通过扩展AllSection1成为{{1}的超集不是一个子集。因此,当您使用All进行验证时,它仅应用All及其超级接口指定的那些。

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

Section1

从这个意义上讲,您可以对自己说interface All extends Section1 /*, Section2, Section3...*/ {} 继承 All的所有约束。

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