当前位置: 首页 > 知识库问答 >
问题:

@有效注释未按预期工作

陶乐生
2023-03-14

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

下面是我的实体课

@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;
    }
  }

验证依赖项

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

我的请求有效负载

[{
   "name":"kiran",
   "gender":"male"
 },
 {
    "name":"divya"
 } 
]

当我发送上述有效负载时,我希望抛出一个错误,因为我没有发送不为null的性别,但spring没有抛出任何错误。

我是否错过了@valid的工作机会。

共有3个答案

莫兴言
2023-03-14

您不能将有效的应用于java。util。列表

请参阅:Spring MVC-@在REST服务中的bean列表中有效

丁昌翰
2023-03-14

如果遇到以下问题,例如:无法看到返回给客户端的验证错误(默认消息),则可以执行以下操作:

顶级解决方案1:只需添加devtools。这应该可以解决问题。完成此操作后,所有绑定结果都返回给客户端。我建议您首先对此进行测试:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
</dependency>

解决方案2:

我发现这是由于使用了Spring Boot 2.3,所以如果您使用的是Spring Boot 2.3或更高版本,请在pom中添加此依赖项。xml文件不再包含在“web”依赖项本身中。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

现在有必要在java/resources/application中设置“include binding errors”。属性设置为“始终”。“message”也是如此,尽管我认为这是可选的。

server.error.include-message=always
server.error.include-binding-errors=always

解决方案3:(在我发现解决方案2之前,它可能也很有用)

所以我发现这是因为有了Spring boot 2.3。但我在Spring Boot v2.3中找不到关于@Valid的最新用法的警告消息。

因此,通过在pom中调整发布版本,我最终切换回了Spring boot v2.2.10(2.2的最新版本)。xml文件如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.10.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

通过回滚到旧版本,这对我来说非常有效。虽然我想有一天更新我的Spring Boot版本。(重温解决方案1

冀子石
2023-03-14

如果使用Spring boot 2.3.3。释放。然后在POM中添加以下依赖项:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

使用示例:

//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));    
}
 类似资料:
  • 我目前正在使用Spring3注释和Hibernate3来实现数据库连接。我还必须使用spring Tiles。 我的spring-servlet.xml是: 我的控制器类: 和我的serviceImpl类: 和我的DaoImpl类: 它仍然给出了以下例外情况。 org.springframework.beans.factory.BeanCreationException:创建名为“MyContro

  • 问题内容: 我在属性文件中定义了一个属性: 然后,我有了class, 仅 当属性设置为true时, 才 应 创建一个Property Configuration bean 。 __ 这是我的课: 如果我在里面添加,只是为了进行实验并查看的值是多少,那么 确实 创建了bean , 并且我看到的值是。 如果我删除了,留下的条件作为和属性更改来自于豆,从未创建(既不也不对)。 我应该怎么做才能基于该属性

  • 问题内容: 我有一个终结点实现,即将一个对象传递给参数列表。我正在尝试使用@NotNull批注来验证该对象是否为null。 如果该对象被验证为非null,则端点将仅返回200 OK响应。但是,当我使用指定的路径向该终结点发出请求时,体内没有任何内容时,不会引发任何错误。相反,我能够检索200响应(即使我在返回响应之前检查对象是否为null,也表明是这种情况)。 有人可以指导我如何以正确的方式验证对

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括: