使用 Spring MVC 按字段将传入的 JSON 分解为对象
Posted
技术标签:
【中文标题】使用 Spring MVC 按字段将传入的 JSON 分解为对象【英文标题】:Decompose incoming JSON to Objects by fields with Spring MVC 【发布时间】:2021-04-20 12:34:33 【问题描述】:我需要使用 Spring Boot 通过 REST 控制器中的字段分解传入的 JSON。
我的请求正文:
"text": "my text",
"myEnum": "VALUE1"
还有我的控制器:
@PatchMapping("/id")
Object updateEntity(@PathVariable Long id, String text, MyEnum myEnum)
/* ... */
@RequestParam
不起作用,因为它仅用于查询字符串参数,@RequestBody
也不起作用,因为它处理整个身体。但我需要按字段分解传入的主体并注入控制器。我知道我可以为此使用Map <String, String>
,但我想验证我的传入字段,并且我有不同类型的字段。而且我不想通过传入的每个控制器的主体来创建一个类。
【问题讨论】:
【参考方案1】:如果我没有误解您的要求,处理传入 JSON 的常用方法是定义一个反映您预期输入的类,并将控制器方法参数注释为 RequestBody。
默认情况下,Spring Boot 使用 Jackson 反序列化到您的类,因此如果您使用匹配的属性名称,那么您将不需要任何特殊的注释或设置。我认为默认情况下会处理枚举,其他类型也是如此(尽管您可能需要为表示日期或时间戳的字符串提供一些指导)。任何错误的值都会导致反序列化失败,我认为您可以在 ControllerAdvice 中处理(尽管您需要仔细检查)
【讨论】:
是的,我知道,但我不想通过 Incoming body 为每个控制器创建一个类 哦,我明白了,如果不查找文档就不确定这是否可行,但怀疑单独的类就像在每个控制器方法中定义分解的属性列表一样简单。如果您使用 Lombok(或 Kotlin),那么您将不需要这些小型数据持有者类的缺点的所有样板代码。 是的,我知道,我也可以使用 java Records,但可能存在其他方式。 哦,当然 - 我仍然坚持使用 Java 8!希望有人回来解决分解问题。如果以后有机会我会四处看看,但现在在工作中。以上是关于使用 Spring MVC 按字段将传入的 JSON 分解为对象的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC 测试,MockMVC:方便地将对象与 JSON 进行转换
在 Spring MVC 中,无法使用 Jackson @JsonFormat 将输入绑定到日期字段