项目上在做Restful接口的一个Post请求,前端在发送json数据后,后端服务报类型转换异常.
1.前端传给接口参数为DTO对象,对象属性为List,参数示例:
{ "list": [ {"email":"xxxxxxxx@qq.com","payApplyNo":"87654321","title":"付款通 知","fileName":"121904631510902_20180309-20180309_3800003661793.jpg"}, {"email":"xxxxxx@hand-china.com","payApplyNo":"123456786","title":"付款通知","fileName":"1.jpg"}, {"email":"xxx@qq.com","payApplyNo":"87654321","title":"付款通知","fileName":"121904631510902_20180309-20180309_3800003661793.jpg"}, {"email":"xxx@163.com","payApplyNo":"87654321","title":"付款通知","fileName":"1.jpg"} ] }2.DTO代码:
public class DTO { private List list; public List getList() { return list; } public void setList(List list) { this.list = list; } }3.接口代码:
public String sendEmail(@RequestBody DTO dto ) { //创建泛型为Entity实体类的List去接收入参里的list集合 List<EmailDTO> list = dto.getList(); //遍历list集合 for (EmailDTO e: list ) { //以下内容与主题无关,略去不写 ...... } }4.调用接口后控制台报错:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.hbcm.sap.api.dto.EmailDTO我传进来的JSON对象的属性明明是list,为什么变成了LinkedHashMap?
在List<EmailDTO> list = dto.getList();打上断点,并输出list.size(),发现是没有问题的 那么问题就发生在ForEach循环中 为什么遍历list集合时,list集合元素会转变成LinkedHashMap? 我的思路到这里就断掉了,因为要赶项目进度,就没有深挖原因,下面讨论一下我是如何解决的.
底层原因尚未明确,希望大佬们不吝赐教,在评论区留下高见
既然知道了问题是类强转问题,那么自然要想办法把这个LinkedHashMap转换为我们需要的List,怎么做呢?
这里需要用到 阿里爸爸 的一个JSON转化工具类:
JSONObject
废话不多说,上代码:
1.maven依赖:
<!--JSONObject依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency>2.Java代码:
public ResponseEntity<List<EmailDTO>> sendEmail(@RequestBody DTO dto ) { //我们放弃直接获取list //List<EmailDTO> list = dto.getList(); /** *先通过JSONObject.toJSONString()方法,把dto.getList()转换为Json字符串, *然后再通过JSONObject.parseArray()方法把这个字符串转换为数组, *最后再通过toJavaList(Entity.class)方法把数组转换为我们需要的集合 */ List<EmailDTO> list = JSONObject.parseArray(JSONObject.toJSONString(dto.getList())).toJavaList(EmailDTO.class); for (EmailDTO e: list ) { } }经过这一系列的转化,终于解决类型转换问题. 希望可以帮助到大家.