You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Jackson JSON反序列化错误:无法从数值反序列化MyUsers

问题分析

Jackson报错核心原因是:你发送的JSON中receiver和sender是数值类型(1、2),但Connections实体类里这两个字段是MyUsers对象类型。Jackson默认无法将数值直接反序列化为MyUsers实例——因为MyUsers没有仅接收id参数的构造方法,Lombok生成的@AllArgsConstructor是全参构造(包含id、userName等所有字段),无法匹配单一数值的反序列化需求。

解决方案

方案1:给MyUsers添加带@JsonCreator的单参构造方法

手动给MyUsers添加仅接收id的构造方法,通过@JsonCreator和@JsonProperty告诉Jackson用这个构造方法处理数值到对象的转换:

@Entity
@Getter @Setter @NoArgsConstructor @AllArgsConstructor
@Table(name = "my_users")
public class MyUsers implements Serializable {
    // 原有字段保持不变...

    // 新增单参构造方法
    @JsonCreator
    public MyUsers(@JsonProperty("id") Long id) {
        this.id = id;
    }
}

Jackson会自动把JSON中的数值(如1)通过这个构造方法创建仅包含id的MyUsers对象,后续JPA在持久化时会根据id关联到数据库中已存在的用户记录。

方案2:使用自定义反序列化器(适用于复杂转换场景)

如果需要更灵活的转换逻辑,可以自定义Jackson反序列化器:

  1. 创建反序列化器类:
public class MyUsersDeserializer extends StdDeserializer<MyUsers> {
    public MyUsersDeserializer() {
        super(MyUsers.class);
    }

    @Override
    public MyUsers deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        Long userId = p.getLongValue();
        MyUsers user = new MyUsers();
        user.setId(userId);
        return user;
    }
}
  1. 在Connections的关联字段上指定反序列化器:
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JsonDeserialize(using = MyUsersDeserializer.class)
private MyUsers receiver;

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JsonDeserialize(using = MyUsersDeserializer.class)
private MyUsers sender;

额外优化:修正JSON布尔值格式

虽然不是报错直接原因,但JSON中following:1和accepted:1建议改成标准布尔值true/false,避免潜在解析问题:

{
    "receiver": 1,
    "sender": 2,
    "following": true,
    "accepted": true
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:16:06