项目上在做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.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
) {
}
}
经过这一系列的转化,终于解决类型转换问题. 希望可以帮助到大家.