有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Micronaut嵌套Json输入验证

如何验证Json主体

{
  "name": "good student",
  "marks": {
    "math": "122",
    "english": "12"
  }
}

这不起作用,它接受JSON正文中有或没有标记,即使@NotNull等被添加到学生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;
    }
}

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


共 (1) 个答案

  1. # 1 楼答案

    这在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;
        }
    }
    

    字段marks应通过以下方式进行注释:

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

    示例控制器如下所示:

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

    通过卷曲测试:

    curl -v -X POST http://localhost:8080/students -H 'Content-Type: application/json' -d '{"name":"John"}' | jq
    

    有了这样的回应:

    {
      "message": "student.marks: must not be null",
      "_links": {
        "self": {
          "href": "/students",
          "templated": false
        }
      }
    }