不可变的龙目岛注释类与杰克逊

2022-09-01 05:32:15

创建类的首选方法是什么

  • 可以使用 Jackson 进行序列化/反序列化
  • 人类可读且具有低级别的样板

最好是,我希望这样的东西工作:

@Data(onConstructor = @__(@JsonCreator))

,然后将所有字段设置为 。但是,这甚至不会编译(我不确定为什么)。用private final

@AllArgsConstructor(onConstructor = @__(@JsonCreator))

将编译,但仅产生

InvalidDefinitionException: No serializer found for class

答案 1

添加构造函数属性

  • 在适当的位置创建一个文件,其中有以下行:lombok.configlombok.anyConstructor.addConstructorProperties = true
  • 将龙目岛注释添加到您的类中,使其不可变@Value

然后,Jackson 的序列化和反序列化按预期工作。

此方法:

编辑: 2020-08-16

  • 注意:使用 with 会导致此解决方案失败。(感谢下面@guilherme-blanco的评论。但是,如果您还添加例如 它仍然按预期工作。@Builder@Value@AllArgsConstructor

编辑: 2021-08-19

  • 注: 添加或更改文件时,除非执行重建(清理然后构建),否则不会选取更改。我被这个抓住了几次。lombok.config
  • @Jacksonized注释解决方案是为注释的特定类实现所需结果的另一种方法。但是,我个人不希望需要记住注释用于反序列化的每个类。使用可消除此开销。lombok.config

答案 2

自 2020 年 10 月 15 日起(龙目岛 v1.18.16),您应该只需使用@Jacksonized注释即可。

@Jacksonized @Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public class JacksonExample {
  private List<Foo> foos;
}

如链接的文档所述,此注释:

  • 将 Jackson 配置为使用生成器进行反序列化,
  • 将特定于字段的配置从带注释的类向下复制到生成的生成器(例如 ),以及@JsonIgnoreProperties
  • 对齐构建器方法上使用的 Jackson 前缀(例如 vs 在龙目岛中配置的那个。builder().withField(field)builder.field(field)