2017-08-17 55 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,以明確設置默認值。