spring controller接收泛型请求体时需解决类型擦除问题,推荐封装为具体泛型类(如apiresponse),替代方案为parameterizedtypereference或typereference手动解析,避免直接使用@requestbody list。

Spring Controller 接收泛型请求体(@RequestBody)时,JSON 映射本身没有特殊语法限制,但关键在于类型擦除导致的反序列化失败问题——Jackson 默认无法得知泛型的实际类型(如 List<user></user> 中的 User),所以必须显式提供类型信息。
使用 ParameterizedTypeReference 解决泛型反序列化
当 Controller 方法需要接收如 List<user></user>、Result<order></order> 这类泛型结构时,不能直接写 @RequestBody List<user></user>(编译通过但运行时报错或数据为空),而应借助 ParameterizedTypeReference 配合 @RequestBody 的封装方式(如用 HttpEntity 或手动解析):
- 推荐做法:将泛型包装进一个具体类(如
Request<t></t>),Controller 直接接收该类,Jackson 可通过类定义推断 T 的实际类型 - 替代做法:用
@RequestBody接收String,再用ObjectMapper.readValue(json, new TypeReference<list>>() {})</list>手动反序列化 - 不推荐:直接写
@RequestBody List<user></user>—— 因类型擦除,Jackson 只看到List,无法构造User实例,通常返回空列表或抛出Cannot construct instance
定义泛型包装类(推荐且简洁)
创建一个带泛型字段的 DTO,例如:
public class ApiResponseprivate int code;
private String message;
private T data;
// getter/setter
}
Controller 中这样写即可正常映射:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
public ApiResponse
Order order = request.getData(); // Jackson 已正确反序列化为 Order
return new ApiResponse(200, "success", process(order));
}
处理嵌套泛型(如 Map>)
若请求体是复杂泛型结构,仍建议封装为具体类。若必须动态解析,用 TypeReference:
public void handleBatch(@RequestBody String json) throws JsonProcessingException {
Map
json,
new TypeReference
注意:Lambda 写法 () -> {} 是为了保留泛型签名,不可省略为匿名内部类以外的形式。
确保 Jackson 配置支持泛型(默认已支持)
Spring Boot 2.6+ 默认使用 Jackson,无需额外配置。但需确认:
- 实体类有无参构造器、字段有 public getter/setter(或启用 Lombok
@Data) - 泛型类型不是纯接口或抽象类(如
List<serializable></serializable>无法实例化) - 避免在泛型中使用未标注
@JsonTypeInfo的多态类型(否则反序列化会失败)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










