2017-09-16 31 views
1

私はマルチモジュールのMavenベースのSpring起動アプリケーションを持っています。私のモジュールのapplication.propertiesファイルでは、ではなく、にタイムスタンプ(配列)として日付をシリアル化しているため、常に文字列としてシリアル化されます(フォールバックの動作)。このプロパティは次のとおりです。Springブート:Jacksonは "application.properties"から設定を取得しません

spring.jackson.serialization.write_dates_as_timestamps=false 

問題は...プロパティは、Spring Boot/Jacksonのいずれかによって取得されていないようです。シリアル化しようとしているjava.time.LocalDateのインスタンスは、タイムスタンプとして常に書き込まれます。私は(ジャクソン自身のJavaTimeModuleから)LocalDateSerializer.serialize(...)メソッド内のコードをチェックし、これを発見した:

@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

おかげで、私は私が問題を把握助けた重要な手がかりを得た。

私のSpringブートアプリケーションには、アプリケーションコンテキストに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

関連する問題