Lombok Builder 和 Jackson 默认值
Lombok Builder and Jackson Default values
我想从序列化中排除一些默认属性。我有以下 class
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;
@JsonInclude(Include.NON_DEFAULT)
@Builder
public class RunTime
{
@JsonProperty
@Builder.Default
private String mystring = "any";
@JsonProperty
@Builder.Default
private Boolean myboolean = true;
@JsonProperty
@JsonInclude(Include.ALWAYS)
@Builder.Default
private Boolean always = true;
}
另外我写了这个测试:
@Test
public void test() throws JsonProcessingException
{
RunTime rac = RunTime.builder().build();
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rac);
assertThat(json).doesNotContain("mystring");
assertThat(json).doesNotContain("myboolean");
assertThat(json).contains("always");
}
我只想在 json 字符串中包含布尔值 always
属性。不幸的是,测试失败了,因为每个 属性 都包含在内。但是,当我删除 Lombok 构建器并自己实例化对象时,我注意到所有这些工作正常。我怎样才能让它与 Lombok 一起工作?
我不确定您是否找到了答案,但我已经确定为什么它不起作用。
如果您对该过程感兴趣,我会继续使用构建器和@Builder.Default.
对源代码进行分解
java -jar lombok.jar delombok -p someFile.java
好像是默认的字段变量setter
@Builder.Default String someValue = "defaultVar"
有效地变成
String someValue;
@java.lang.SuppressWarnings("all")
private static Optional<String> $default$someValue() {
return "defaultVar";
}
这意味着 Lombok 正在做一些骇人听闻的事情,它将实例化从字段变量本身拉到 Builder 的 build() 调用中。它会检查构建器中的 "staged" 值是否已设置,如果未设置,则调用 $default$someValue()
以获取该默认值。
这意味着 jackson 序列化将无法设置您指定的默认属性。它应该调用 main class 的默认构造函数并将这些值有效地设置为 null。
有点不幸,我希望 lombok 团队意识到这一点,但您需要创建自己的 AllArgsConstructor 或显式设置默认值的 NoArgsConstructor。
我想从序列化中排除一些默认属性。我有以下 class
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;
@JsonInclude(Include.NON_DEFAULT)
@Builder
public class RunTime
{
@JsonProperty
@Builder.Default
private String mystring = "any";
@JsonProperty
@Builder.Default
private Boolean myboolean = true;
@JsonProperty
@JsonInclude(Include.ALWAYS)
@Builder.Default
private Boolean always = true;
}
另外我写了这个测试:
@Test
public void test() throws JsonProcessingException
{
RunTime rac = RunTime.builder().build();
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(rac);
assertThat(json).doesNotContain("mystring");
assertThat(json).doesNotContain("myboolean");
assertThat(json).contains("always");
}
我只想在 json 字符串中包含布尔值 always
属性。不幸的是,测试失败了,因为每个 属性 都包含在内。但是,当我删除 Lombok 构建器并自己实例化对象时,我注意到所有这些工作正常。我怎样才能让它与 Lombok 一起工作?
我不确定您是否找到了答案,但我已经确定为什么它不起作用。
如果您对该过程感兴趣,我会继续使用构建器和@Builder.Default.
对源代码进行分解java -jar lombok.jar delombok -p someFile.java
好像是默认的字段变量setter
@Builder.Default String someValue = "defaultVar"
有效地变成
String someValue;
@java.lang.SuppressWarnings("all")
private static Optional<String> $default$someValue() {
return "defaultVar";
}
这意味着 Lombok 正在做一些骇人听闻的事情,它将实例化从字段变量本身拉到 Builder 的 build() 调用中。它会检查构建器中的 "staged" 值是否已设置,如果未设置,则调用 $default$someValue()
以获取该默认值。
这意味着 jackson 序列化将无法设置您指定的默认属性。它应该调用 main class 的默认构造函数并将这些值有效地设置为 null。
有点不幸,我希望 lombok 团队意识到这一点,但您需要创建自己的 AllArgsConstructor 或显式设置默认值的 NoArgsConstructor。