@valid annotation is not working as expected
我正在使用请求有效负载中的对象数组调用API,我在@RequestBody上添加了@valid批注,以检查是否在我的有效负载中发送了任何null属性。我期望如果我发送的任何空数据都应该引发错误。但是我的代码没有抛出错误
下面是我的实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Data @NoArgsConstructor @AllArgsConstructor @Builder @DynamicUpdate @Entity @Table(name ="student") public class Student { @Id @Column(name ="student_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer studentId; @NotNull @Column(name ="name") private String name; @NotNull @Column(name ="gender") private String gender; } |
这是我的控制器类
1 2 3 4 5 6 7 8 9 10 11 12 | @RestController @CrossOrigin public class StudentController { @PostMapping("/class/{classId}/student") public Student addStudent(@PathVariable Integer classId,@Valid @RequestBody List<Student> student) { // My logic Comes Here return Student; } } |
验证依赖项
1 2 3 4 | <dependency> <groupId>org.springframework.boot</groupId> spring-boot-starter-validation</artifactId> </dependency> |
我的请求有效载荷
1 2 3 4 5 6 7 8 | [{ "name":"kiran", "gender":"male" }, { "name":"divya" } ] |
当我发送上面的有效载荷时,我希望抛出一个错误,因为我没有发送不为null的性别,但是spring不会抛出任何错误。
我是否想让@valid工作?
如果您使用Spring Boot 2.3.3.RELEASE。然后在POM中添加以下依赖项:
1 2 3 4 | <dependency> <groupId>org.springframework.boot</groupId> spring-boot-starter-validation</artifactId> </dependency> |
使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 | //update audTipo @PutMapping("audTipo/{id}") public ResponseEntity<AudTipo> update(@PathVariable(value="id") Integer audTipoId, @Valid @RequestBody AudTipo audTipoDetils) throws ResourceNotFundException { AudTipo audTipo = audTipoRepository.findById(audTipoId).orElseThrow(()-> new ResourceNotFundException("NF" + audTipoId)); audTipo.setXdesc(audTipoDetils.getXdesc()); return ResponseEntity.ok(this.audTipoRepository.save(audTipo)); } |
您不能将
请参阅:Spring MVC-REST服务中的bean列表上的@Valid
例如,如果您遇到以下问题:无法将验证错误(默认消息)返回给客户端,则可以执行以下操作:
最佳解决方案1:
只需添加devtools。这应该可以解决问题。完成此操作后,我所有的绑定结果都返回给客户端。我建议您首先进行测试:
1 2 3 4 | <dependency> <groupId>org.springframework.boot</groupId> spring-boot-devtools</artifactId> </dependency> |
解决方案2:
我发现这是由于使用Spring Boot 2.3
因此,如果您使用的是Spring Boot 2.3或更高版本,请将此依赖项添加到pom.xml文件中,因为它不再包含在" web"依赖项本身中。
1 2 3 4 | <dependency> <groupId>org.springframework.boot</groupId> spring-boot-starter-validation</artifactId> </dependency> |
现在有必要将java / resources / application.properties中的"包含绑定错误"设置为"始终"。"消息"也是如此,尽管我认为这是可选的。
1 2 | server.error.include-message=always server.error.include-binding-errors=always |
解决方案3 :(在我发现解决方案2可能也有帮助之前)
所以我发现这是由于安装了Spring boot 2.3造成的。但是我在Spring Boot v2.3中找不到有关@Valid的新更新用法的警告消息。
因此,我最终通过调整pom.xml文件中的发行版来切换回Spring boot v2.2.10(2.2的最新版本),如下所示:
1 2 3 4 5 6 | <parent> <groupId>org.springframework.boot</groupId> spring-boot-starter-parent</artifactId> <version>2.2.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> |
通过回滚到较早的版本,这对我来说非常理想。虽然id??喜欢有一天要更新我的Spring Boot版本。 (重访解决方案1
您的
示例中的注释将验证列表,而不是列表中的每个对象。
试试这个
您还可以指定其他参数,例如,您可能需要验证列表中的每个对象,并确保列表不为空或具有最小大小等。这些验证必须在列表中执行。铅>
当Spring Boot找到带有@Valid注释的参数时,它将自动引导默认的JSR 380实现" Hibernate Validator a"并验证该参数。
仅当Request本身为NULL时,才会违反JSR 380实现。如上所述,它不能用于检查请求正文中的空值。