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

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

一.问题背景:

项目上在做Restful接口的一个Post请求,前端在发送json数据后,后端服务报类型转换异常.

1.前端传给接口参数为DTO对象,对象属性为List,参数示例:

{
"list": [
    {"email":"[email protected]","payApplyNo":"87654321","title":"付款通	知","fileName":"121904631510902_20180309-20180309_3800003661793.jpg"},
    {"email":"[email protected]","payApplyNo":"123456786","title":"付款通知","fileName":"1.jpg"},
	{"email":"[email protected]","payApplyNo":"87654321","title":"付款通知","fileName":"121904631510902_20180309-20180309_3800003661793.jpg"},
	{"email":"[email protected]","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 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 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
             ) {
    }
}

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

你可能感兴趣的:(Java)