2017-07-10 27 views
0

我經由暴露下面Map一個@RestControllerServlet如何在Spring中註冊java.sql.Timestamp的全局格式化程序?

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

地圖然後包含java.sql.Timestamp對象。

問題:如何設置Springjaxb/jacksonTimestamp生成的輸出格式?我想在全球範圍內設置它。我不想看地圖來手動檢測並重新設置這些值的格式。

以下沒有工作:序列化JSON期間

@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"; 
      } 
     }); 
    } 
} 

格式化被註冊,但從來沒有叫!

當前結果總是如下:2017-07-10T11:06:02.000+0000。但我想要得到2017-07-10 11:06:02無處不在。

+0

我認爲你需要的@EnableWebMvc上一流水平 – Zeromus

+0

我使用'彈簧boot',我可以看到格式化被成功註冊。所以配置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 
     } 
    }; 
} 
相關問題