2017-09-16 95 views
1

我有一個基於Maven的多模塊Spring應用程序。在我的一個模塊的application.properties文件中,我將Jackson設置爲而不是將日期序列化爲時間戳(數組),以便它們始終作爲字符串序列化(這是回退行爲)。該物業是這樣的:Spring Boot:傑克遜不會從「application.properties」中獲取配置

spring.jackson.serialization.write_dates_as_timestamps=false 

問題是...財產似乎並沒有通過任何春啓動/傑克遜被拾起。我試圖序列化的java.time.LocalDate實例總是被寫爲時間戳。我已經檢查了LocalDateSerializer.serialize(...)方法裏面的代碼(來自傑克遜自己JavaTimeModule),並發現這一點:

@Override 
public void serialize(LocalDate date, JsonGenerator generator, SerializerProvider provider) throws IOException 
{ 
    if (useTimestamp(provider)) { // This always returns true 
     generator.writeStartArray(); 
     generator.writeNumber(date.getYear()); 
     generator.writeNumber(date.getMonthValue()); 
     generator.writeNumber(date.getDayOfMonth()); 
     generator.writeEndArray(); 
    } else { 
     String str = (_formatter == null) ? date.toString() : date.format(_formatter); 
     generator.writeString(str); 
    } 
} 

useTimestamp()方法總是返回true,不管我的配置是什麼。 :(

回答

0

由於Indra的答案,我得到了一個重要線索,幫助我找出問題。

原來,我的Spring Boot應用程序在其應用程序上下文中有多個RestTemplate實例(它是一個非常大的系統,依賴於一些自定義專有框架的工作),其中大多數RestTemplate實例僅用於支持我的系統體系結構。有只有一個RestTemplate我應該關心的實例:我寫了,並允許我的業務邏輯工作(通過讓我的系統使用遠程RESTful API)。

所以,當我試圖配置傑克遜及其ObjectMapper,我是不是真的影響了我的RestTemplate實例。在讀取配置的時候,那個RestTemplate很早就被Spring Boot提供的默認設置初始化了。

這是我最後的配置類的樣子:

@Configuration 
public class RestConfiguration { 

    @Bean 
    public RestTemplate myRestTemplate(HttpMessageConverters customConverters) { 
     RestTemplate restTemplate = new RestTemplate(); 
restTemplate.setMessageConverters(customConverters.getConverters()); 
     return restTemplate; 
    } 

    /* 
    * The following custom HttpMessageConverter is injected into myRestTemplate 
    * in order to appropriately configure the serialization/deserialization of LocalDate 
    * instances into/from strings. 
    */ 
    @Bean 
    public HttpMessageConverters customConverters() { 
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 

     ObjectMapper mapper = new ObjectMapper(); 
     mapper.registerModule(new JavaTimeModule()); 
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

     converter.setObjectMapper(mapper); 
     return new HttpMessageConverters(converter); 
    } 

} 

什麼我做的是明確配置RestTemplate實例了需要進行配置。

以下的文檔也很有幫助:HttpMessageConverters。它描述瞭如何聲明用於應用程序上下文中的自定義HttpMessageConverters。

1

也許你可以創建一個自定義MappingJackson2HttpMessageConverterObjectMapper。下面是一個例子配置類,

@Configuration 
public class MyConfiguration extends WebMvcConfigurerAdapter { 
    @Bean 
    public MappingJackson2HttpMessageConverter 
     getMappingJacksonHttpMessageConverter() { 
     MappingJackson2HttpMessageConverter converter = 
      new MappingJackson2HttpMessageConverter(); 
     ... 

     ObjectMapper mapper = new ObjectMapper(); 
     ... 
     mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
     //or 
     // mapper.configure(
     // SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

     converter.setObjectMapper(mapper); 
     return converter; 
    } 

} 
+0

是否需要擴展WebMvcConfigurerAdapter? – Enrique

+0

我通常按照上面示例中的方式完成。更多的控制'ObjectMapper'的行爲。 –

+0

創建一個自定義的'HttpMessageConverter'使我意識到必須將它明確地注入到我試圖配置的RestTemplate實例中。我添加了一個詳細說明我的發現的答案。 :) – Enrique