使用Lombok为Jackson自动生成构造函数属性,以在存在多个构造函数时反序列化

问题描述

我有一个不变的类,定义为:

@Value
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ImmutableDTO {
     (...)
}

由于不可变,我想反序列化通过构造函数表示的JSON。 我想避免必须使用@ConstructorProperties或@PropertyNames显式标记绑定属性。

1。因此,首先,我试图寻找一种仅靠杰克逊来做到这一点的方法,因为在其他情况下,杰克逊足够聪明。在pom.xml上添加ParameterNames模块并定义构造函数

@AllArgsConstructor(access = AccessLevel.PRIVATE,onConstructor_= {@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)})

似乎是徒劳的,因为似乎每种方式都需要标记每个属性。

2。因此,我寻找了Lombok解决方案。我最喜欢的方法是找到一个显式注释,该注释标记用于生成构造函数属性的特定构造函数,但我找不到它

3。作为后备,我依靠lombok.anyConstructor.addConstructorProperties = true全局lombok.config设置,但是随后为我的两个构造器的属性添加了注释,因此最终出现错误:com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Conflicting property-based creators:。我找不到lombok工具来从属性标记生成中选择退出特定的构造函数(类似于旧式 @RequiredArgsConstructor(suppressConstructorProperties = true)

那么,有什么方法可以完成我的任何方法(按优先顺序排列),或者至少完成任何一种方法?

PS:因为我的@Builder正在预先计算某些字段,所以我不能使用@JsonDeserialize(builder = (...))工具,即使用替代构造函数(这就是为什么我同时需要这两个原因,一个用于Jackson,另一个用于通过代码进行操作(生成器),其中包含已计算的字段)

P.S2:我研究了启动选项jackson.mapper.infer_creator_from_constructor_properties: true,但是我做错了什么,或者只是将显式功能(否则将jackson-module-parameter-names导入pom.xml时会自动注册)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)