You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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就行。

关键注意事项

不管用哪种方案,都要确保你的ProjectUser类满足以下条件:

  • 有无参构造函数(Jackson反序列化必须)
  • 所有需要被赋值的字段都有对应的getter和setter
  • 字段名称和前端发送的JSON键名一致(或者用@JsonProperty注解指定映射关系)

内容的提问来源于stack exchange,提问作者Sourour Blel

火山引擎 最新活动