在 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 正文以获取信息时(例如:Name
和 Age
),如果输入了 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 对象的主要内容,如果未能解决你的问题,请参考以下文章