爪哇 | 验证包装器内的 JSON 对象

Aec*_*lys 1 java spring json bean-validation spring-boot

我正在使用 Java Spring 框架并收到一个 JSON 输入。它由数千个MyObjects. 我希望应用程序在 或 之一MyObjects失败AnotherObjects约束(@NotNull@Size)时抛出异常。到目前为止,应用程序在对对象执行某些操作时(而不是在其构造期间)NullPointerException访问该字段时就会抛出异常。null

我的问题是:

有没有办法最好使用注释来检查嵌套 JSON 对象的约束?

JSON 看起来像:

{
  "myObjects": [
    {
      "code": "PQ",
      "another_objects": [
        {
          "attr1": "value1",
          "attr2": "value2",
          "attrN": "valueN"
        },
        {
          "attr1": "value1",
          "attr2": "value2",
          "attrN": "valueN"
        }
      ]
    },
    {
      ...
    }
  ]
} 
Run Code Online (Sandbox Code Playgroud)

该 servlet 看起来像:

@RequestMapping(value = ...)
public final void doSomething(@Valid @RequestBody MyObjectWrapper wrapper) {
    // do something very time-heavy here
}    
Run Code Online (Sandbox Code Playgroud)

对象定义如下:

public class MyObjectWrapper {
    private List<MyObject> myObjects;

    public List<MyObject> getMyObjects() {
        return myObjects;
    }

    public void setMyObjects(List<MyObjects> myObjects) {
        this.myObjects = myObjects;
    }
}
Run Code Online (Sandbox Code Playgroud)

和 MyObject 类:

public class MyObject {

    @NotNull
    @NotEmpty(message = ...)
    List<AnotherObject> anotherObjects;

    @NotNull
    @Size(min = 2, max = 2, message = ...)
    String code;

    @JsonCreator
    public MyObject(@JsonProperty("another_objects") List<AnotherObjects> anotherObjects,
                    @JsonProperty("code") String code) {
        this.code = code;
        this.anotherObjects = anotherObjects;
    }

    /*  getters and setters */
}
Run Code Online (Sandbox Code Playgroud)

AnotherObjects 类似,但仅由字符串组成。

Sta*_*avL 5

添加@Valid到包装器的嵌套对象

public class MyObjectWrapper {
    @Valid
    private List<MyObject> myObjects;

    public List<MyObject> getMyObjects() {
        return myObjects;
    }

    public void setMyObjects(List<MyObjects> myObjects) {
        this.myObjects = myObjects;
    }
}
Run Code Online (Sandbox Code Playgroud)