spring rest @RequestBody 不使用 @Valid 验证

Posted

技术标签:

【中文标题】spring rest @RequestBody 不使用 @Valid 验证【英文标题】:spring rest @RequestBody does not validate with @Valid 【发布时间】:2022-01-17 06:35:40 【问题描述】:

我正在学习 java 和 spring boot,我正在尝试验证从 json 绑定的控制器参数。

我有一个简单的实体:

@Getter
@Setter
class Resource 
    @NotBlank
    String uri;

我想通过以下控制器持久化:

@BasePathAwareController
public class JavaResourcePostController 

    private final ResourceRepository repository;

    public JavaResourcePostController(ResourceRepository repository) 
        this.repository = repository;
    

    @RequestMapping(value = "/resources", method = RequestMethod.POST)
    ResponseEntity<Resource> create(
        @Valid @RequestBody Resource resource
    ) 
        repository.save(resource);

        return ResponseEntity.ok(resource);
    

我的理解是资源参数在进入方法的时候应该是有效的。但是发布一个空的uri 字段不会触发该方法的验证。但是,它确实会在 repository.save() 的休眠验证中触发

为什么参数上的@Valid 注释不能确保我得到一个经过验证的实体?

【问题讨论】:

尝试将@Validated添加到您的控制器。 docs.spring.io/spring-framework/docs/current/javadoc-api/org/… 当我在班级级别 idd 上注释 @Validated 时有效!我只在论点和方法上试过这个。您可以将此作为答案发布,以便可以接受和关闭吗? 【参考方案1】:

您需要将@Validated 添加到您的控制器类中。

【讨论】:

这个 idd 解决了这个问题,知道为什么这在 kotlin 中不起作用,只在 java 中起作用吗? 为了让它在 kotlin 中工作,我还需要将 spring 插件添加到 kotlin maven 插件中,如下所示:***.com/questions/52345291/…

以上是关于spring rest @RequestBody 不使用 @Valid 验证的主要内容,如果未能解决你的问题,请参考以下文章

spring rest @RequestBody 不使用 @Valid 验证

不支持 Spring Rest POST Json RequestBody 内容类型

如何在 Spring Boot REST API 中启用对 JSON / Jackson @RequestBody 的严格验证?

@RequestBody 不适用于 Rest 服务

Spring @requestBody

Ajax JQuery 到 Spring @RequestBody?我如何传递数据?