2012-06-08 23 views
1

我正在努力定義我的jsr 303驗證規則,即爲我的容器bean重新定義默認組。對列表和列表元素進行Jsr 303驗證

@GroupSequence({Container.class, Container.Step2.class}) 
public class Container { 
@NotNull 
private String def; 

@Valid 
@Size(min = 20, groups = Container.Step2.class) 
private List<Element> elems = new LinkedList<Element>(); 

public interface Step2{} 
} 

public class Element{ 
@NotNull 
private String foo; 
} 

我想有容器豆的大小驗證,當且僅當:

  • DEF屬性有效
  • 的任何元素豆沒有驗證錯誤withing elems的收集
如果我使用默認組驗證Container:

即使內部元素bean存在驗證錯誤,也會觸發大小驗證程序。

如果我從容器類刪除@GroupSequence(跳過重新定義默認組容器),並定義自己的GroupSequence爲:

@GroupSequence({Default.class, Container2.Step2.class}) 
public interface AllValid{} 
然後

與AllValid組生效:如預期

Container c = new Container(); 
... 
validator.validate(c, Container2.AllValid.class); 

一切正常。 任何想法?

回答

0

我決定查看一下hibernate-validator的源代碼來調查問題。它看起來像在驗證root bean之後執行關聯的級聯驗證。兩個驗證(根bean的驗證和關聯)都使用「目標組」執行。通過「目標羣體」我的意思是你通過組作爲驗證方法的最後一個參數。如果沒有傳遞組/組參數,則將「默認組」設置爲「目標組」。在我來說,我重新定義了默認組根bean所以打電話:

validator.validate(c) 

力容器中的Bean與組序列進行驗證:默認,Container.Step2.class。在這個元素列表被驗證之後(使用默認組)。在這種情況下,容器和元件是獨立驗證的。

如果一些知道任何技巧,使我的默認組的驗證工作,請評論我的職務,但現在我會留在具有明確組容器的驗證,即

validator.validate(c, Container2.AllValid.class);