2017-07-10 6 views
0

私は@RestControllerServletを経由して、次のMapを露出している:Springでjava.sql.Timestampのグローバルフォーマッタを登録するには?

List<Map<String, Object>> results = jdbcTemplate.queryForList(..); 

マップは、その後java.sql.Timestampオブジェクトが含まれています。

質問:Timestampjaxb/jacksonを使用してSpringの出力形式を設定するにはどうすればよいですか?私はそれをグローバルに設定したい。私は値を手動で検出して再フォーマットするために地図を見たくない。

以下は動作しませんでした:

@Configuration 
public class DateConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void addFormatters(FormatterRegistry registry) { 
     super.addFormatters(registry); 
     registry.addFormatterForFieldType(java.sql.Timestamp.class, new Formatter<Timestamp>() { 
      @Override 
      public String print(Timestamp object, Locale locale) { 
       return "my custom format"; 
      } 
     }); 
    } 
} 

フォーマッタが登録されますが、呼び出されることはありませんJSONにシリアライズ中に!

現在の結果は常に2017-07-10T11:06:02.000+0000です。しかし、どこでも2017-07-10 11:06:02を取得したいと思います。

+0

私はあなたが私が '春-boot'を使用している、と私は正常に登録されているフォーマッタを見ることができますクラスレベル – Zeromus

+0

に@EnableWebMvcが必要だと思います。したがって、設定Beanは一般的に動作します。シリアライズされたタイムスタンプ値には影響しません。 – membersound

答えて

1

デフォルトでは、@ DateTimeFormatで注釈されていない日付と時刻フィールドは、DateFormat.SHORTスタイルを使用して文字列から変換されます。必要に応じて、独自のグローバルフォーマットを定義して変更することができます。

以下の例:

@Configuration 
public class AppConfig { 

    @Bean 
    public FormattingConversionService conversionService() { 

     // Use the DefaultFormattingConversionService but do not register defaults 
     DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false); 

     // Ensure @NumberFormat is still supported 
     conversionService.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory()); 

     // Register date conversion with a specific global format 
     DateFormatterRegistrar registrar = new DateFormatterRegistrar(); 
     registrar.setFormatter(new YourTimeStampFormatter()); 
     registrar.registerFormatters(conversionService); 

     return conversionService; 
    } 
} 

次のようにhere

+0

'java.sql.Timestamp'が' 2017-07-10T11:06:02.000 + 0000'の形式でシリアル化されているので、あなたの見積もりはおそらく真ではありません。これは確かに 'DateFormat.SHORT'ではありません。 – membersound

+1

DateTimeFormat java.util.Date、java.util.Calendar、java.lang.Long、Joda-Timeの値の型に適用できます。 Spring 4とJDK 8では、JSR-310のjava.time型にも対応しています。だからあなたは正しい。 'java.sql.Timestamp'では、' DateFormat.SHORT'を使用しません。おそらく、ドキュメンテーションでは不明な点が多いかもしれません。 –

0

ソリューションを参照してください。

@Bean 
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { 
    return new Jackson2ObjectMapperBuilderCustomizer() { 
     @Override 
     public void customize(Jackson2ObjectMapperBuilder builder) { 
      builder.dateFormat(new ISO8601DateFormat()); //or your custom date converter 
     } 
    }; 
} 
関連する問題