在 SpringBoot 中使用 @Valid 和 @Requestbody 验证 JSON 对象

Posted

技术标签:

【中文标题】在 SpringBoot 中使用 @Valid 和 @Requestbody 验证 JSON 对象【英文标题】:Validation of JSON Object With @Valid and @Requestbody in SpringBoot 【发布时间】:2021-12-31 14:45:01 【问题描述】:

我正在尝试在 post 方法中验证 JSON 正文。这是一个示例代码:

@PostMapping(value = "GetInfo")
public ResponseEntity<Person> getOffers(@Valid @RequestBody InfoRequest infoRequest) 
   //generate person response according to inforequest JSON.
   Person person = PersonGenerator.getOffers(infoRequest);
   return new ResponseEntity<>(person, HttpStatus.OK);

当我发送 JSON 正文以获取信息时(例如:NameAge),如果输入了 Person 类不需要的一些额外字段,我希望程序抛出错误。作为下面ExtraField 的示例。但是@RequestBody@Valid 注释只是检查匹配的字段。因为它被过滤了(在这种情况下,afaik ExtraField 被过滤了)我无法获得完整的 JSON 来分析 infoRequest 以查找是否发送了任何额外信息。


    "Name": "sample",
    "Age": "sample",
    "ExtraField": "prevent",

我知道有一些库可以检查 JSON 文件。但首先我必须知道会发生什么:)。 如果没有注释可以看到输入的额外字段。如何提取和分析 JSON 文件*

注意:出于安全考虑,不能将参数类型 infoRequest 更改为字符串。

【问题讨论】:

您是否使用 Jackson 进行 JSON 序列化/反序列化? 【参考方案1】:

默认情况下,Spring Boot 配置将禁用 Jackson DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 功能。一种可能的解决方案是在您的 application.yml 文件中再次启用它,如下所示:

spring.jackson.deserialization.fail-on-unknown-properties=true

这将改变 Jackson ObjectMapper 的行为,如果您想要更细粒度的配置,您可以使用 @JsonIgnoreProperties(ignoreUnknown = false),如下所示:

@JsonIgnoreProperties(ignoreUnknown = false)
public class InfoRequest 
    (...)

【讨论】:

以上是关于在 SpringBoot 中使用 @Valid 和 @Requestbody 验证 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 巧用全局处理器,优雅的解决参数校验!

后端使用@Valid注解进行数据校验

SpringBoot之表单验证@Valid

springboot~@Valid注解对嵌套类型的校验

在 Spring Boot 应用程序中使用 @Valid 和 BindingResult 时的表单输入验证问题

SpringBoot_@valid_参数校验