2017-08-17 52 views
0

我想剔除序列化的一些默认属性。我有以下类龙目岛生成器和杰克逊默认值

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财产。不幸的是,由于每个属性都包含在内,因此测试失败。不过,我注意到,当我移除龙目岛构建器并由我自己实例化对象时,所有这些工作都正常。我如何才能与龙目岛合作?

回答

0

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

如果你对这个过程感兴趣,我继续使用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"; 
} 

含义龙目岛是做它拉动实例从外地变量一些哈克事本身放入Builder的build()调用中。它会检查构建器中的“staged”值是否已设置,如果没有,则调用$default$someValue()以获取该默认值。

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

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