RestTemplate调用接口反序列化对象列表报错:无法将数组转为BankingList类型
错误根本原因
你的BankingClient接口直接返回List<Banking>,序列化后是JSON数组结构(开头为[),但你在AccountClient里用BankingList类作为响应类型接收,BankingList是Java对象,对应的JSON结构为对象格式(开头为{,内部包含list字段),两者结构完全不匹配,Jackson无法把数组反序列化为对象,因此抛出该错误。
另外你原有代码逻辑存在小问题:循环遍历账户列表时,每次请求的结果直接覆盖了b变量,最终只会返回最后一个账户的交易记录,不会合并所有账户的交易。
解决方案1:修改AccountClient的接收逻辑(无需修改BankingClient代码)
用ParameterizedTypeReference指定接收List<Banking>类型,再手动把结果合并到BankingList中:
@GetMapping("/listofTrans/{cid}") public BankingList getTrans(@PathVariable Integer cid) { List<Account> a = acc.getByCid(cid); BankingList b = new BankingList(); // 初始化list避免空指针 b.setList(new ArrayList<>()); for(Account a1:a) { // 用ParameterizedTypeReference接收泛型List ResponseEntity<List<Banking>> response = restTemplate.exchange( "http://BankingClient/banking/"+a1.getAno(), HttpMethod.GET, null, new ParameterizedTypeReference<List<Banking>>() {} ); List<Banking> transList = response.getBody(); if(transList != null) { // 把当前账户的交易添加到总列表 b.getList().addAll(transList); } } return b; }
解决方案2:修改BankingClient的返回结构(和你定义的BankingList匹配)
把BankingClient的接口返回值改成BankingList类型,将查询到的交易列表封装进去:
@GetMapping("/{ano}") public BankingList getTrans(@PathVariable Integer ano) { BankingList bankingList = new BankingList(); bankingList.setList(service.getTrans(ano)); return bankingList; }
同时修正你原有BankingList类的语法错误,public List<Banking> list后缺少分号,建议调整为符合POJO规范的写法:
public class BankingList { private List<Banking> list; public List<Banking> getList() { return list; } public void setList(List<Banking> list) { this.list = list; } }
任选一个方案即可解决反序列化错误,优先推荐方案1,无需改动接口提供方的服务代码,适配性更强。
内容的提问来源于stack exchange,提问作者Baburao_007
相关产品推荐
相关产品推荐

