【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));
    }
相关推荐
nanxun88619 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103511 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师1 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师1 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 天前
mac(m5)平台编译openjdk
java
唐青枫2 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马2 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261352 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261352 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454753 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程