问题代码:
public Object getAjpc(ScreenDto screenDto) {
String cgyBh = screenDto.getCgyBh();
RestTemplate restTemplate = new RestTemplate();
String CGYUrl = baseUrl+"api/v1/cgy?cgyBh={cgyBh}";
JSONArray jsonArr = new JSONArray();
List<JcVO> jcVOList = restTemplate.getForObject(CGYUrl, ArrayList.class, cgyBh);
......
}
异常原因:
在使用RestTemplate调用服务的时候,因为服务提供者返回的是一个List集合,所以期待返回类型写成ArrayList.class,
就报了java.util.LinkedHashMap cannot be cast to…这个异常,
但是调用过程中数据类型的变化是:服务提供者返回的是LIst集合,但是标记了@RequestBody,
所以返回的时候会把List集合转变成json的形式(内部是jackjson技术支持的),
像下面这种写法,
// List<JcVO> jcVOList = restTemplate.getForObject(CGYUrl, ArrayList.class, cgybh);
就会再把提供者返回的json转变成list,
但是这个list跟之前不一样, (一个是jackjson转变的,一个是restTemplate转变的,可能内部机制不一样),
所以遍历集合就会报上面的异常.
改进方法:
接受一个json字符串,再使用阿里巴巴的fastjson将json字符串转变成list集合,
String jsonTemp = restTemplate.getForObject(CGYUrl, String.class, cgyBh);
List<JcVO> jcVOList = JSON.parseArray(jsonTemp, JcVO.class);
此文章本人原创,如有问题底部留言,如有转载请标明出处。
--HurryChen
Happy Coding!
*\( ^ v ^ )/*