Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @有效批注未按预期工作_Java_Spring Boot_Spring Data Jpa_Spring Data - Fatal编程技术网

Java @有效批注未按预期工作

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

我使用请求负载中的对象数组调用API,我在@RequestBody中添加了@valid注释,以检查负载中是否发送了任何空属性。我希望我发送的任何空数据都会抛出错误。但我的代码没有抛出错误

下面是我的实体类

@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.发布
这对我来说非常有效