使用 lombok @Singular 和 jackson @JsonPOJOBuilder

using lombok @Singular with jackson @JsonPOJOBuilder

通过jackson smile反序列化器调试后,发现我的List注解为@Singular的jackson并没有找到。

有没有办法用杰克逊 @JsonPOJOBuilder 制作 @Singular

@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
@Value
@Builder
@RequiredArgsConstructor
@EqualsAndHashCode
public class MyClass {

    @NonNull String name;
    @NonNull @Singular List<String> favs = new ArrayList<>();

    @JsonPOJOBuilder(withPrefix = "")
    public static final class MyClassBuilder {
    }
}

@Singular 更改为 @Builder.Default 效果很好。

这里的问题是您初始化 favs 字段:

List<String> favs = new ArrayList<>();

这是由于 @Value annotation is final. Therefore it is not available to be set/overwritten by either the builder or the constructor generated by @RequiredArgsConstructor。通过尝试自己构造一个实例来验证:

MyClass.builder().name("a").fav("1").fav("2").build();

intellij 这里说没有 fav 方法但是 @Builder@Singular 应该创建一个。
解决方法:

  1. 在字段声明时跳过favs的初始化,让lombok、jackson初始化
  2. 创建您自己的构建器,将元素添加到预先存在的列表中

我测试了 lombok 1.16.18 和 jackson 2.9.2