[英]Hibernate Validator doesn't validate elements in a JSON array
我想使用Hibernate Validator針對JSR 303批注驗證JSON數組。 雖然驗證適用於JSON對象和數組類型的屬性(使用@Valid
),但將跳過對頂級JSON數組元素的驗證。
例如:
public class ValidationTest {
public static void main(String[] args) throws IOException {
ObjectMapper m = new ObjectMapper();
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
System.out.println(validator.validate(m.readValue("{}", Person.class)));
System.out.println(validator.validate(m.readValue("[{}]", Person[].class)));
System.out.println(validator.validate(m.readValue("{\"array\":[{}]}", PersonArray.class)));
}
}
class Person {
@NotNull
private String name;
public String getName() {
return name;
}
public Person setName(String name) {
this.name = name;
return this;
}
}
class PersonArray {
@Valid
private Person[] array;
public Person[] getArray() {
return array;
}
public PersonArray setArray(Person[] array) {
this.array = array;
return this;
}
}
輸出:
[ConstraintViolationImpl{interpolatedMessage='must not be null', propertyPath=name, rootBeanClass=class com.radius.Person, messageTemplate='{javax.validation.constraints.NotNull.message}'}]
[]
[ConstraintViolationImpl{interpolatedMessage='must not be null', propertyPath=array[0].name, rootBeanClass=class com.radius.PersonArray, messageTemplate='{javax.validation.constraints.NotNull.message}'}]
如您所見,必需的name
屬性已針對Person
進行了驗證,並針對PersonArray
內部的array
進行了遞歸驗證,但未驗證Person[]
。 有沒有一種方法可以對頂級JSON數組進行遞歸驗證?
在hibernate-validator和validation-api jar中進行挖掘,我發現您需要在類中添加驗證批注以觸發驗證過程,而Person[].class
沒有任何注釋,因此不會獲得對數組元素的遞歸驗證啟動。 對於您的示例,似乎BeanDescriptor.isBeanConstrained()
返回false。
/**
* Returns {@code true} if the bean involves validation:
* <ul>
* <li>a constraint is hosted on the bean itself</li>
* <li>a constraint is hosted on one of the bean properties</li>
* <li>or a bean property is marked for cascaded validation ({@link Valid})</li>
* </ul>
* <p>
* Constrained methods and constructors are ignored.
*
* @return {@code true} if the bean involves validation, {@code false} otherwise
*/
boolean isBeanConstrained();
一個簡單且非侵入式的修復程序是一個類似於以下的類:
import javax.validation.Valid;
public class ValidWrapper<T> {
@Valid
private T[] data;
public ValidWrapper(final T[] _data) {
this.data = _data;
}
public T[] getData() {
return data;
}
}
然后,您可以驗證任何數組,例如:
validator.validate(m.readValue("{\"data\": [{}]}", ValidWrapper.class)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.