【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));
    }
相关推荐
zww89491111 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设3 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳3 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥3 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
devpotato3 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
xcl09253 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·spring boot·需求分析
Kyrie_kk4 小时前
Java--IO--Path文件访问
java·后端
qinqinzqq4 小时前
Maven POM 格式、Schema 与 XSD:一篇讲透
java·maven
o盟4 小时前
maven本地仓库有 总是去私仓中下载
java·maven·intellij-idea
devpotato4 小时前
Java 批量并发请求:从“能并发“到“结果按完成顺序可用“的三种写法与选型
java