Spring 使用@Valid 注释的@RequestBody 验证问题

Spring @RequestBody validation issue using @Valid annotation

我正在尝试使用 @Valid 注释对 Spring Boot @RequestBody JSON 对象执行验证。

此 JSON 对象 POJO class 将包含另一个嵌套对象。 我为嵌套对象添加了字段级注释 classes.

此外,我在主对象 class.

中添加嵌套 class 对象时添加了 @Valid 注释

但是,当我们没有传递正确的对象时,嵌套 class 对象的验证仍然不会被触发。

请找到下面的代码以供参考。

ExceptionController.class

@RestController
@RequestMapping("/student")
public class ExceptionController {
  
  @PostMapping
  @ResponseStatus(HttpStatus.CREATED)
  public String createStudent(@Valid @RequestBody Student student, HttpStatus status) {
    Student student1 = student;
    return "student data created!!";
  }
}

Student.class

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
  @NotEmpty(message = "First Name field can not be null or empty")
  @NotBlank(message = "First Name field can not be blank")
  private String firstName;
  @NotEmpty(message = "Last Name field can not be null or empty")
  @NotBlank(message = "Last Name field can not be blank")
  private String lastName;
  @Valid
  private Subject subject;      
}

Subject.class

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Subject {
  @NotEmpty(message = "Topic field can not be null or empty")
  @NotBlank(message = "Topic field can not be blank")
  private String topic;
}

当我没有在请求中为 Subject 发送任何数据时,它没有给出任何异常和 returns HTTP 200 OK 状态。

任何帮助将不胜感激。

尝试将 @NotNull 注释添加到 Subject subject:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
  @NotEmpty(message = "First Name field can not be null or empty")
  @NotBlank(message = "First Name field can not be blank")
  private String firstName;
  @NotEmpty(message = "Last Name field can not be null or empty")
  @NotBlank(message = "Last Name field can not be blank")
  private String lastName;
  @Valid
  @NotNull
  private Subject subject;      
}

只有当您实际发送 Subject 数据但 topic 属性为空时,您当前的验证才会起作用。

关于另一个主题,您可能会删除 @NotEmpty 注释,因为 @NotBlank 不允许 null 或空字符串。