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

Lombok Builder与Jackson反序列化异常:无法从字符串构建Limit实例

解决Lombok @Jacksonized Builder反序列化字符串到嵌套对象的问题

问题场景

现有使用Lombok注解的数据模型:

@Value
@Jacksonized
@Builder(builderClassName = "Builder", setterPrefix = "with")
public class Limits {
  Limit minimum;
  Limit maximum;
}
@Value
@Jacksonized
@Builder(builderClassName = "Builder", setterPrefix = "with")
public class Limit {
  @JsonValue
  String value;
}

序列化时可正常输出预期JSON:

{
  "minimum": "One-Day",
  "maximum": "One-Year"
}

但反序列化相同JSON时,出现错误:

Cannot construct instance of `Limit$Builder` (although at least one Creator exists):
no String-argument constructor/factory method to deserialize from String value ('One-Day')

尝试给Limit的Builder方法添加@JsonCreator注解无效。

解决方案

在不修改核心数据模型字段和JSON格式的前提下,给Limit类添加一个带@JsonCreator注解的静态工厂方法,直接从字符串创建Limit实例:

@Value
@Jacksonized
@Builder(builderClassName = "Builder", setterPrefix = "with")
public class Limit {
  @JsonValue
  String value;

  @JsonCreator
  public static Limit fromString(String value) {
    return Limit.builder().withValue(value).build();
  }
}

原理说明

  • @JsonValue负责将Limit序列化为字符串,但反序列化时Jackson需要明确规则将字符串转回Limit实例。
  • 给静态工厂方法添加@JsonCreator后,Jackson会优先调用该方法将字符串转换为Limit对象,而非尝试直接实例化Limit$Builder,完美适配现有Builder模式和JSON格式。
  • 该方案仅新增静态工厂方法,未修改原有数据模型核心结构,也无需调整JSON内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:41:18