使用 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
应该创建一个。
解决方法:
- 在字段声明时跳过
favs
的初始化,让lombok、jackson初始化
- 创建您自己的构建器,将元素添加到预先存在的列表中
我测试了 lombok 1.16.18 和 jackson 2.9.2
通过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
应该创建一个。
解决方法:
- 在字段声明时跳过
favs
的初始化,让lombok、jackson初始化 - 创建您自己的构建器,将元素添加到预先存在的列表中
我测试了 lombok 1.16.18 和 jackson 2.9.2