2016-07-26 59 views
0

@JsonSerialize和JsonSerializer實現的所有示例均爲similar,如下所示。Jackson XML - @JsonSerialize串行器運行時配置

public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> { 

    private static final String dateFormat = ("MM/dd/yyyy"); 

    @Override 
    public void serialize(DateTime date, JsonGenerator gen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 

     String formattedDate = DateTimeFormat.forPattern(dateFormat).print(date); 

     gen.writeString(formattedDate); 
    } 

} 

它有一個類級別的變量,它定義了它的運行時行爲。這在運行時不能通過配置進行更改。

如何使dateFormat高於可配置屬性,同時在屬性上使用@JsonSerialize(using = JodaDateTimeJsonSerializer.class)

現在,我正在考慮將它作爲運行時應用程序在運行時設置的序列化器實現的靜態非最終屬性。不適合非常適當的實施。編輯:理想的解決方案將允許我只將所需的配置注入到串行器中,而不是從某些全局中檢索配置。我不想爲這個屬性創建一個新的數據類型(它們都是字符串),我不想創建一個自定義bean序列化程序(它們可以在任何字符串屬性上註釋)。因此,我也不能使用SimpleModule::addSerializer(class, serializer)方法,因爲它們不應該添加到所有字符串屬性中。

回答

0

你好一些ResourceBundle實現提供了緩存功能。這就是說,在這種情況下查看諸如日期格式之類的屬性將不會對應用程序產生性能影響,並且可以在您的方法中直接查看它。

爲了使配置的任何更改在運行時生效。您應該以一定的時間間隔或者在更新配置文件時清除ResourceBundle緩存。這可以通過調用該方法輕鬆實現:

ResourceBundle.clearCache(); 
+0

在我看來,這仍然會破壞封裝(需要全局配置對象)。在我的情況下,我的選項已經被Dropwizard加載,而不是ResourceBundle。這是一個稍微好一點的選項(因爲這些值可以在運行時重新加載),但我仍然願意提供更好的選擇。感謝您的答覆。 –

+0

@DarylTeo剛剛閱讀您的編輯「理想的解決方案將允許我只將所需的配置注入序列化程序,而不是從一些全局檢索配置」如果錯誤,請糾正我,但「注入」只是一種模式,你仍然會需要一艘船來保存你的配置。如果注入是你的問題,你可以隨時注入一個依賴注入框架。 –

+0

我的不好的選擇:我使用術語「注入」作爲動詞,不一定是DI框架暗示的「注入」。道歉 –