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

使用ObjectMapper获取泛型列表时无法返回指定类型的问题

问题:ObjectMapper反序列化泛型列表返回LinkedHashMap而非指定类型

尝试通过ObjectMapper获取泛型列表,但返回的List元素是LinkedHashMap而非指定的DTO类型,触发ClassCastException。

相关代码

public <T,V> List<V> invokeService(T request, String url,Class<V> type) {

    HttpEntity requestEntity = new HttpEntity<>(sdsRequest, headers);
    ResponseEntity<String> response= restTemplate.exchange(returnURI,HttpMethod.POST,requestEntity,String.class);

    ObjectMapper objectMapper=new ObjectMapper();
    ObjectReader objectReader = objectMapper.reader().forType(new TypeReference<List<V>>(){});
    try {
        List<V> list = objectReader.readValue(response.getBody());
        log.info("returned value {}",list );
        return list;
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
}

输出结果

returned value [{settlement_group_id=72, id=3142193, value=812954, code=GO}]

异常信息

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.service.dtos.PartyMapResponseDTO (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.service.dtos.PartyMapResponseDTO is in unnamed module of loader 'app')

原因及解决方案

问题根源

Java泛型擦除机制导致运行时TypeReference<List<V>>中的V类型信息丢失,ObjectMapper无法识别要反序列化的具体DTO类型,只能默认将JSON对象反序列化为LinkedHashMap。

修复代码

使用ObjectMapper的TypeFactory构造包含具体类型的集合类型,明确指定List的元素类型:

public <T,V> List<V> invokeService(T request, String url,Class<V> type) {

    HttpEntity requestEntity = new HttpEntity<>(sdsRequest, headers);
    ResponseEntity<String> response= restTemplate.exchange(returnURI,HttpMethod.POST,requestEntity,String.class);

    ObjectMapper objectMapper=new ObjectMapper();
    // 构造List<type>的具体类型
    JavaType listType = objectMapper.getTypeFactory().constructCollectionType(List.class, type);
    ObjectReader objectReader = objectMapper.readerFor(listType);
    try {
        List<V> list = objectReader.readValue(response.getBody());
        log.info("returned value {}",list );
        return list;
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
}

修改后,ObjectMapper可准确将JSON数组反序列化为指定类型的List,避免ClassCastException。

内容的提问来源于stack exchange,提问作者Chandresh Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:47:52