Spring Boot Controller如何接收两种不同类型的RequestBody对象
Spring Boot Controller接收多类型RequestBody解决方案
- 方案1:使用Jackson内置多态反序列化(推荐)
这是最符合Spring MVC序列化规范的实现方式,无需额外手动转换逻辑:
- 定义公共父类/接口,添加Jackson多态配置注解
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.io.Serializable; @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value = Apple.class, name = "APPLE"), @JsonSubTypes.Type(value = Orange.class, name = "ORANGE") }) public abstract class Fruit implements Serializable { // 可提取Apple和Orange的公共字段放在此处 }
- 让Apple、Orange类继承该父类即可,无需修改原有类的其他逻辑
- 调整Controller接收参数类型为父类
Fruit:
public MyResponse myMethod(@ApiParam(value = "myRequest", required = true) @RequestBody Fruit mulRequest) { if (mulRequest instanceof Apple apple) { // 执行Apple对应的处理逻辑 } else if (mulRequest instanceof Orange orange) { // 执行Orange对应的处理逻辑 } }
调用接口时只需在请求JSON中携带"type": "APPLE"或"type": "ORANGE"字段即可,Jackson会自动完成类型反序列化。
- 方案2:无侵入式手动判断转换(无需修改请求结构)
如果不想在请求参数中额外加type标识,可以先接收原始JSON再根据两个类的独有字段判断后转换:
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public MyResponse myMethod(@ApiParam(value = "myRequest", required = true) @RequestBody String json) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(json); // 示例:假设Apple独有字段为sweetness,Orange独有字段为sourness,按实际业务调整判断条件 if (rootNode.has("sweetness")) { Apple apple = objectMapper.readValue(json, Apple.class); // 执行Apple对应的处理逻辑 } else if (rootNode.has("sourness")) { Orange orange = objectMapper.readValue(json, Orange.class); // 执行Orange对应的处理逻辑 } else { // 非法参数异常处理 } }
注意事项
Java类名需遵循大驼峰命名规范,建议将原有apple、orange类名调整为Apple、Orange。
内容的提问来源于stack exchange,提问作者Gopikrishna X Gopalakrishnan
相关产品推荐
相关产品推荐

