使用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
相关产品推荐
相关产品推荐

