簡體   English   中英

Hibernate Validator不會驗證JSON數組中的元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM