You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用泛型时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-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:34:59