Java @有效批注未按预期工作
我使用请求负载中的对象数组调用API,我在@RequestBody中添加了@valid注释,以检查负载中是否发送了任何空属性。我希望我发送的任何空数据都会抛出错误。但我的代码没有抛出错误 下面是我的实体类Java @有效批注未按预期工作,java,spring-boot,spring-data-jpa,spring-data,Java,Spring Boot,Spring Data Jpa,Spring Data,我使用请求负载中的对象数组调用API,我在@RequestBody中添加了@valid注释,以检查负载中是否发送了任何空属性。我希望我发送的任何空数据都会抛出错误。但我的代码没有抛出错误 下面是我的实体类 @Data @NoArgsConstructor @AllArgsConstructor @Builder @DynamicUpdate @Entity @Table(name = "student") public class Student { @Id @Column(nam
@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;
}
@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;
}
}
这是我的控制器类
@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;
}
@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;
}
}
当我发送上面的有效负载时,我希望抛出一个错误,因为我没有发送不为null的性别,但是spring没有抛出任何错误
我是否遗漏了@valid to work的内容。您的
@valid
注释应用于列表,而不是列表中的实际对象
示例中的注释验证列表,而不是列表中的每个对象
试试这个
public Student addStudent(@PathVariable Integer classId,@RequestBody List students)
您还可以指定其他参数,例如,您可能需要验证列表上的每个对象,并确保列表不是空的,或具有最小大小等。这些验证必须在列表上执行。您的
@Valid
注释应用于列表,而不是列表上的实际对象
示例中的注释验证列表,而不是列表中的每个对象
试试这个
public Student addStudent(@PathVariable Integer classId,@RequestBody List students)
您还可以指定其他参数,例如,您可能需要验证列表上的每个对象,并确保列表不是空的,或具有最小大小等。这些验证必须在列表上执行。当Spring Boot发现一个带有@Valid注释的参数时,它自动引导默认的JSR380实现—HibernateValidator—并验证参数
只有当请求本身为NULL时,JSR380实现才会被违反。如上所述,它不能用于检查请求正文中的空值。当Spring Boot找到带有@Valid注释的参数时,它会自动引导默认JSR 380实现Hibernate Validator并验证该参数
只有当请求本身为NULL时,JSR380实现才会被违反。如上所述,它不能用于检查请求正文中的空值。您不能将
@Valid
应用于java.util.List
请参阅:您不能将
@Valid
应用于java.util.List
请参阅:如果您使用Spring boot 2.3.3.RELEASE。然后在POM中添加以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
org.springframework.boot
弹簧启动启动器验证
使用示例:
//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));
}
//更新audTipo
@PutMapping(“auditipo/{id}”)
public ResponseEntity更新(@PathVariable(value=“id”)整数auditipoid,
@有效@RequestBody auditipo auditipodetils)引发ResourceNotFundException
{
auditipo auditipo=auditiporepository.findById(auditipoid.orelsetrow)(()->new
ResourceNotFundException(“NF”+Auditipoid));
setXdesc(auditipodetils.getXdesc());
返回ResponseEntity.ok(this.auditipository.save(auditipo));
}
如果使用Spring boot 2.3.3.0版本。然后在POM中添加以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
org.springframework.boot
弹簧启动启动器验证
使用示例:
//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));
}
//更新audTipo
@PutMapping(“auditipo/{id}”)
public ResponseEntity更新(@PathVariable(value=“id”)整数auditipoid,
@有效@RequestBody auditipo auditipodetils)引发ResourceNotFundException
{
auditipo auditipo=auditiporepository.findById(auditipoid.orelsetrow)(()->new
ResourceNotFundException(“NF”+Auditipoid));
setXdesc(auditipodetils.getXdesc());
返回ResponseEntity.ok(this.auditipository.save(auditipo));
}
如果您遇到以下问题,例如:无法看到返回到客户端的验证错误(默认消息),您可以这样做:
顶级解决方案1:
只需添加devtools。这应该可以解决问题。完成此操作后,所有绑定结果都返回给客户机。我建议您先测试一下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
解决方案3:(在我发现同样有用的解决方案2之前)
所以我发现这是因为有了SpringBoot2.3+。但是我在SpringBootV2.3+中找不到关于@Valid的新更新用法的警告消息
因此,通过调整pom.xml文件中的发布版本,我最终切换回Spring boot v2.2.10(2.2的最新版本),如下所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
org.springframework.boot
spring启动程序父级
2.2.10.发布
通过回滚到旧版本,这对我来说非常有效。虽然我想有一天更新我的Spring Boot版本。(重新访问解决方案1和2)如果您遇到以下问题,例如:无法看到返回给客户端的验证错误(默认消息),您可以这样做: 顶级解决方案1: 只需添加devtools。这应该可以解决问题。完成此操作后,所有绑定结果都返回给客户机。我建议您先测试一下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
解决方案3:(在我发现同样有用的解决方案2之前)
所以我发现这是因为有了SpringBoot2.3+。但是我在SpringBootV2.3+中找不到关于@Valid的新更新用法的警告消息
因此,通过调整pom.xml文件中的发布版本,我最终切换回Spring boot v2.2.10(2.2的最新版本),如下所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
org.springframework.boot
spring启动程序父级
2.2.10.发布
这对我来说非常有效