2010-11-05 57 views
39

是否有可能驗證JSR 303中的對象集合 - Jave Bean Validation,其中集合本身沒有任何註釋,但包含的元素是做什麼的?JSR 303:如何驗證註釋對象的集合?

例如,有可能是這導致約束衝突由於對第二個人一個空的名字:

List<Person> people = new ArrayList<Person>(); 
people.add(new Person("dave")); 
people.add(new Person(null)); 

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
Set<ConstraintViolation<List<Person>>> validation = validator.validate(people); 

回答

55

是,只需添加@Valid到集合中。

這是來自Hibernate Validator Reference的an example

public class Car { 
    @NotNull 
    @Valid 
    private List<Person> passengers = new ArrayList<Person>(); 
} 

這是標準的JSR-303行爲。請參閱spec的第3.1.3節。

+0

好極了,好多了! – cam 2012-09-14 21:04:39

+0

我假設在這種情況下,@NotNull驗證將驗證pase的列表不爲空,並且數組的每個元素中的Person都不爲空。不是嗎? – borjab 2016-09-16 14:51:36

+0

否...查看https://stackoverflow.com/questions/27984137/java-beans-validation-collection-map-does-not-contain-nulls – Archie 2017-08-10 19:54:30

2

你當然也可以只遍歷列表和電話Validator.validate在每個元素上。或者把List放入一些包裝bean中,並用@Valid對它進行註釋。擴展ArrayList進行驗證對我來說似乎是錯誤的。 你有一個特定的用例,你想解決這個問題嗎?如果是這樣,也許你可以再解釋一下。要回答你最初的問題:

是否可以驗證 集合對象在JSR 303 - 的Jave Bean驗證,其中 集合本身不具有任何 註釋,但元素包含DO內 ?

沒有

+0

我正在使用JAX-RS,並有一個json的對象列表,我解析成java bean列表。我沒有包裝對象的列表,所以沒有財產註釋... 我認爲,如果這將是一個普遍問題沒有一個包裝bean,而不是創建一個新的包裝每種類型的列表,它可能更容易只註釋一個通用列表子類。我認爲這也可以實現,雖然使用通用包裝bean,如您所建議的,例如: public class ValidatableListBean > { @Valid private T list; } – cam 2010-11-09 10:23:07

+0

事實上,也許這類將看起來更像是這樣的: 公共類ValidatableBeanList { @Valid 私人列表列表; } – cam 2010-11-09 10:29:00

+0

ValidatableBeanList 對您的用例看起來很合理。 – Hardy 2010-11-10 09:04:36

17

您也可以將@NotEmpty添加到集合中。

public class Car { 
    @NotEmpty(message="At least one passenger is required") 
    @Valid 
    private List<Person> passengers = new ArrayList<Person>(); 
} 

這將確保至少有一名乘客出現,並且@Valid註釋確保每個Person對象進行驗證

0

我寫了這個通用類:

public class ValidListWrapper<T> { 

    @Valid 
    private List<T> list; 

    public ValidListWrapper(List<T> list) { 
     this.list = list; 
    } 

    public List<T> getList() { 
     return list; 
    } 

} 

如果您正在使用傑克遜庫來反序列化JSON,您可以在構造函數中添加@JsonCreator註釋,Jackson會自動將JSON數組反序列化爲包裝對象。