Angular4+Spring Boot POST请求类型转换异常:LinkedHashMap无法转Project
解决Spring Boot中LinkedHashMap无法转自定义类的ClassCastException问题
这个问题我太熟了!你遇到的java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.example.backendtest.Project,本质原因是Spring用Jackson反序列化JSON时,会把未知类型的对象默认转成LinkedHashMap,而LinkedHashMap和你的自定义Project类完全是两个不同的类型,直接强转肯定会失败。
下面给你几个实用的解决方案,按推荐程度排序:
方案1:创建统一请求DTO(最推荐)
这是最优雅的做法,直接定义一个包含所有需要接收对象的DTO类,让Spring自动帮你完成反序列化:
首先创建请求DTO:
public class ProjectRequestDTO { private Project project; private User user; // 按需添加其他需要接收的对象字段 // 必须提供无参构造函数,以及所有字段的getter/setter public ProjectRequestDTO() {} // getter和setter public Project getProject() { return project; } public void setProject(Project project) { this.project = project; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
然后修改你的接口方法,直接用DTO接收:
@PostMapping("/project") public void addProject(@RequestBody ProjectRequestDTO requestDTO) { Project project1 = requestDTO.getProject(); System.out.println(project1.getName()); // 如果需要处理User,直接用requestDTO.getUser()即可 }
这种方式不仅避免了类型转换的问题,代码可读性也更高,后期维护更方便。
方案2:用ObjectMapper手动转换
如果因为某些原因必须用HashMap接收,可以借助Jackson的ObjectMapper来把LinkedHashMap转换成你的自定义类:
首先注入ObjectMapper(Spring Boot默认已经配置好了):
@Autowired private ObjectMapper objectMapper;
然后修改接口方法:
@PostMapping("/project") public void addProject(@RequestBody HashMap<String, Object> map) { // 把map中的"project"对应的LinkedHashMap转成Project对象 Project project1 = objectMapper.convertValue(map.get("project"), Project.class); System.out.println(project1.getName()); // 同理处理User对象 User user = objectMapper.convertValue(map.get("user"), User.class); }
convertValue方法会帮你完成类型转换,只要你的自定义类有正确的无参构造和getter/setter就行。
关键注意事项
不管用哪种方案,都要确保你的Project和User类满足以下条件:
- 有无参构造函数(Jackson反序列化必须)
- 所有需要被赋值的字段都有对应的getter和setter
- 字段名称和前端发送的JSON键名一致(或者用
@JsonProperty注解指定映射关系)
内容的提问来源于stack exchange,提问作者Sourour Blel




