【Result<T>泛型接收转化失败】

问题描述:

最近有个接口,明明接受对象是同一个,但是却报错

代码如下

系统A 的接口

java 复制代码
@RestController
@RequestMapping("log")
public class LogController {

    @GetMapping("getLog")
    List<LogInfo> getLog(){
        List<LogInfo> logInfos = new ArrayList<>();
        LogInfo logInfo = new LogInfo();
        logInfo.setMsg("1");
        logInfo.setName("t1");
        LogInfo logInfo2 = new LogInfo();
        logInfo2.setMsg("2");
        logInfo2.setName("t2");
        logInfos.add(logInfo);
        logInfos.add(logInfo2);
        return logInfos;
    }
}

系统B接入

java 复制代码
@RestController
@RequestMapping("myService")
public class MyController {

    @Resource
    RestTemplate restTemplate;

    @GetMapping("getLog")
    Result<List<LogInfo>> getLog(){
        List<LogInfo> logInfos = restTemplate.getForObject("http://localhost:9001/log/getLog", List.class);
        return Result.OK(logInfos);
    }

    @GetMapping("deal")
    Result<?> deal(String name){
        Result<List<LogInfo>> log = getLog();
        List<LogInfo> logInfos = log.getData();
        Map<String, List<LogInfo>> collect = logInfos.stream().collect(Collectors.groupingBy(LogInfo::getName));
        return Result.OK(collect.get(name));
    }
}

猜猜哪个方法报错了

接收没问题,处理报错了

这个错误是因为在使用RestTemplate时,没有指定返回的List中的元素类型,导致RestTemplate将JSON反序列化为List,而不是List。

当我们尝试将LinkedHashMap转换为LogInfo时,就会抛出ClassCastException。
解决方法

方案一:使用exchange方法,并传递ParameterizedTypeReference

java 复制代码
@GetMapping("exchange")
    Result<?> exchange(String name){
        ResponseEntity<List<LogInfo>> responseEntity = restTemplate.exchange(
                "http://localhost:9001/log/getLog",
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<List<LogInfo>>() {});
        List<LogInfo> logInfos = responseEntity.getBody();
        Map<String, List<LogInfo>> collect = logInfos.stream().collect(Collectors.groupingBy(LogInfo::getName));
        return Result.OK(collect.get(name));
    }
相关推荐
嘻哈∠※1 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7982 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2583 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息4 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒5 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了5 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道6 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_949950636 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路7 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq