前后端数据传输转换问题-java.util.LinkedHashMap cannot be cast to Entity

mac2024-04-10  38

前后端数据传输转换问题-java.util.LinkedHashMap cannot be cast to Entity

一.问题背景:

项目上在做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 ) { } }

经过这一系列的转化,终于解决类型转换问题. 希望可以帮助到大家.

最新回复(0)