Micronaut 嵌套 Json 输入验证

Ayu*_*osh 5 java micronaut

如何验证 Json Body

{
  "name": "good student",
  "marks": {
    "math": "122",
    "english": "12"
  }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,它接受 JSON 正文中带或不带标记的内容,即使 @NotNull 等添加到 Student DTO 中的标记

@Introspected
public @Data class Student {
    @NotBlank
    private String name;
    
    @Valid
    @JsonProperty("marks")
    private Marks marks;
    
    @Introspected
    static @Data class Marks{
        @NotBlank
        private String math;
        @NotBlank
        private String english;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 @Validated 注释的控制器 使用 @Valid @Body 注释的方法参数

cgr*_*rim 4

这在 Micronaut 版本 2.0.3 中对我有用:

@Introspected
public @Data class Student {
    @NotBlank
    private String name;

    @Valid
    @NotNull
    private Marks marks;

    @Introspected
    static @Data class Marks{
        @NotBlank
        private String math;

        @NotBlank
        private String english;
    }
}
Run Code Online (Sandbox Code Playgroud)

字段marks应注释为:

  • @NotNull- 告诉验证者它必须存在
  • @Valid- 告诉验证器它必须验证嵌套字段

示例控制器如下所示:

@Validated
@Controller("/students")
public class StudentController {
    @Post
    public void create(@Valid @Body Student student) {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

通过卷曲测试:

curl -v -X POST http://localhost:8080/students -H 'Content-Type: application/json' -d '{"name":"John"}' | jq
Run Code Online (Sandbox Code Playgroud)

有了这个回应:

{
  "message": "student.marks: must not be null",
  "_links": {
    "self": {
      "href": "/students",
      "templated": false
    }
  }
}
Run Code Online (Sandbox Code Playgroud)