2012-03-19 81 views
3

鉴于以下类和接口JSR303验证组继承

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

interface All{} 
interface Section1 extends All {} 

当调用

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

我认为它应该是无效的,因为myString为空,它不是空组延伸所有,但它不。请注意,我正在使用验证器的Hibernate impl(4.0.2.GA)

回答

5

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

对于给定的界面Z,限制标记为属于所述基团Z(即,其中所述注释元件组包含接口Z)或任何的超接口中的Z(继承组)被认为是基团Z.

换句话说的一部分,如果用Section1.class验证和标记@NotNullAll.class,约束将被应用。但不是相反。

认为它是一组:All是一种常见的约束集,并且通过延伸AllSection1成为超集的All,而不是一个子集。因此,当您验证使用All,它仅适用于由All其超级接口指定的那些。

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

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

在这个意义上,你可以对自己说,All继承所有的约束条件Section1

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

+0

+1这个很好的解释。我对整个概念的唯一问题是,我不能让默认组扩展我的部分。所以当我希望Default组验证所有内容时,我必须将它添加到我使用另一个组的所有地方。至少我是这么想的。刚才看到您可以重新定义默认组:http://beanvalidation.org/1.0/spec/#constraintdeclarationvalidationprocess-groupsequence-redefiningdefaultgroup – Gandalf 2015-02-10 20:07:11