使用泛型时RestTemplate响应被反序列化为LinkedHashMap的解决问询
解决方案
1. 修正字段映射注解
首先检查CommandResponse类的字段映射,你的JSON响应中result字段对应Java类的result属性,但代码里错误标注了@JsonProperty("parameters"),这会导致Jackson无法正确匹配字段,先修正这个问题:
@Getter @Setter @NoArgsConstructor public class CommandResponse<T> { public CommandResponse(int code, String message, T result) { this.code = code; this.message = message; this.result = result; } private int code; private String message; // 修正为匹配JSON的"result"字段 @JsonProperty("result") private T result; }
2. 修改泛型请求方法,传递具体类型信息
由于Java的泛型擦除机制,在泛型方法内部创建的ParameterizedTypeReference<CommandResponse<T>>无法保留T的具体类型信息,Jackson只能将反序列化结果转为LinkedHashMap。解决办法是在调用方法时传入包含具体类型的ParameterizedTypeReference实例:
private <T> ResponseEntity<CommandResponse<T>> sendRequest(SomeRequestBody body, HttpHeaders headers, ParameterizedTypeReference<CommandResponse<T>> typeRef) { HttpEntity<SomeRequestBody> entity = new HttpEntity<>(body, headers); String url = "http://localhost:8081"; return restTemplate.exchange(url, HttpMethod.POST, entity, typeRef); }
3. 调用方法时传入具体的类型引用
针对单个对象和对象数组的场景,分别创建对应的ParameterizedTypeReference:
单个对象场景(如UserBalanceResponse)
// 创建包含具体类型的ParameterizedTypeReference ParameterizedTypeReference<CommandResponse<UserBalanceResponse>> singleTypeRef = new ParameterizedTypeReference<CommandResponse<UserBalanceResponse>>() {}; // 调用请求方法 ResponseEntity<CommandResponse<UserBalanceResponse>> response = sendRequest(body, headers, singleTypeRef); // 直接获取正确类型的result UserBalanceResponse balance = response.getBody().getResult();
对象数组/集合场景(如List<UserBalanceResponse>)
// 创建集合类型的ParameterizedTypeReference ParameterizedTypeReference<CommandResponse<List<UserBalanceResponse>>> listTypeRef = new ParameterizedTypeReference<CommandResponse<List<UserBalanceResponse>>>() {}; // 调用请求方法 ResponseEntity<CommandResponse<List<UserBalanceResponse>>> listResponse = sendRequest(body, headers, listTypeRef); // 直接获取List类型的result List<UserBalanceResponse> balanceList = listResponse.getBody().getResult();
4. 确保RestTemplate配置正确的Jackson转换器
如果是自定义的RestTemplate,需要确保添加了MappingJackson2HttpMessageConverter以支持Jackson反序列化:
@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); // 可选:配置ObjectMapper的额外特性,比如忽略大小写 ObjectMapper objectMapper = new ObjectMapper() .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES); jacksonConverter.setObjectMapper(objectMapper); // 将Jackson转换器放在最前面,优先使用 restTemplate.getMessageConverters().add(0, jacksonConverter); return restTemplate; }
内容的提问来源于stack exchange,提问作者zoobiE-
相关产品推荐
相关产品推荐

