Java Lombok Builder和Jackson默认值

Java Lombok Builder和Jackson默认值,java,jackson,lombok,Java,Jackson,Lombok,我想从序列化中删除一些默认属性。我有以下课程 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) @

我想从序列化中删除一些默认属性。我有以下课程

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字符串中包含boolean
always
属性。不幸的是,测试失败了,因为每个属性都包含在内。然而,当我移除Lombok构建器并自己实例化对象时,我注意到所有这些都可以正常工作。我怎样才能让Lombok工作呢?

我不确定你是否找到了答案,但我已经确定了为什么它不工作

如果您对这个过程感兴趣,我会继续使用builder和@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";
}
字符串值;
@java.lang.SuppressWarnings(“全部”)
私有静态可选$default$someValue(){
返回“defaultVar”;
}
这意味着Lombok正在做一些骇人的事情,它将字段变量本身的实例化拉入生成器的build()调用中。它检查生成器中的“staged”值是否已设置,如果未设置,则调用
$default$someValue()
以获取该默认值

这意味着jackson序列化将无法设置指定的默认属性。它应该调用主类的默认构造函数,并有效地将这些值设置为null

有点不幸,我希望lombok团队意识到这一点,但是您需要创建自己的AllArgsConstructor或NoArgsConstructor来显式设置默认值