JSR303验证组继承

dst*_*arh 3 java bean-validation

给出以下类和接口

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

interface All{}
interface Section1 extends All {}
Run Code Online (Sandbox Code Playgroud)

打电话的时候

A =新A(); validator.validate(一,All.class);

我希望它应该是无效的,因为myString是null并且它是notNull组扩展All但它没有.请注意,我正在使用验证器的Hibernate impl(4.0.2.GA)

Mar*_*ers 6

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

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

换句话说,如果您使用Section1.class并标记@NotNullAll.class,则会应用约束.但不是相反.

把它看成是一组:All是一种常见的约束集,并且通过延伸All,Section1变成了超集All,而不是一个子集.因此,在验证使用时All,它仅应用All由其及其超级接口指定的那些.

如果你想All成为发现的约束的超集Section1,你需要翻转继承:

interface All extends Section1 /*, Section2, Section3...*/ {}
Run Code Online (Sandbox Code Playgroud)

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

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