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反序列化器:
- 创建反序列化器类:
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; } }
- 在
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
相关产品推荐
相关产品推荐

