报错的内容
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to xxx(实体类)
原因
通过前端axios传入两个参数{‘gym’:gym,‘date’:datevalue},后端Controller通过@RequestBody接收,因为是多参数且不能整合到一个实体类里,所以使用Map接收了数据,并调用gymUserService的方法将Map传入confirmOrder方法里。
@PostMapping("/confirm")
public XX confirmOrder(@RequestBody Map<String,Object> params) {
return gymUserService.confirmOrder(params);
}
在confirmOrder方法中,我想将Map中的数据取出并赋值
public XX confirmOrder(Map<String,Object> params){
//错误信息告诉我,此时发生了错误 ClassCastExcetion
Gym gym = (Gym)params.get('gym');
Date date = (Date)params.get('datevalue');
}
分析
通过报错的信息分析,ClassCastException是因为类型转换失败的运行时异常。
我通过Debug模式知道,Map中存放的所有对象都被自动转换成了LinkedHashMap类型。原因就是强制转换失败导致不能正常赋值而造成的异常。
但为什么强制转换失败暂时不知道,留着以后写吧…
解决
通过网上的很多方案都是让我将Map中的对象转换为JSON字符串,再将JSON字符串转换为对象即可正常赋值。
ps:此处作用只是添加jar包,初学者看不懂就直接网上下载fastjsonjar包下载导入就可以了
//加入alibaba-fastjson依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
转换代码:
/*
JSON.toJSONString(Object obj)是将对象转换成JSON字符串
JSON.parseObject(Stirng str,XX.class)将JSON字符串str转换为xx.class类型
*/
Gym gym = JSON.parseObject(JSON.toJSONString(params.get("gym")),Gym.class);
Date date = JSON.parseObject(JSON.toJSONString(params.get("datevalue")),Date.class);