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
相关产品推荐
相关产品推荐

