Jackson序列化LocalDate與Springboot集成


前言

Java8的date API一經推出便廣受好評,今日也准備用一用,然后就用出問題了。基本用法見https://www.cnblogs.com/woshimrf/p/java8-date-api.html

問題

LocalDate可以很友好的toString為YYYY-MM-dd的格式,很適合我當前的業務,但當我把它丟到json的時候,瞬間解體了:

{
  "year": 2018,
  "month": "AUGUST",
  "era": "CE",
  "dayOfMonth": 1,
  "dayOfWeek": "TUESDAY",
  "dayOfYear": 213,
  "leapYear": false,
  "monthValue": 8,
  "chronology": {
      "id":"ISO",
      "calendarType":"iso8601"
   }
}

可我想要的是yyyy-MM-dd啊。加上jackson format試一試,也不行。

@JsonFormat(shape = JsonFormat.Shape.STRING,
        pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai")

難道要手動實現JsonSerializer? google之,果然有人解決了。

解決

添加

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.8.6</version>
</dependency>

用法

@Test
public void testJsonFormat() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    LocalDate date = LocalDate.of(2018, 5, 5);
    String dateStr = mapper.writeValueAsString(date);
    Assert.assertEquals("\"2018-05-05\"", dateStr);

    LocalDateTime dateTime = LocalDateTime.of(2018, 5, 5, 1, 1, 1);
    Assert.assertEquals("\"2018-05-05T01:01:01\"", mapper.writeValueAsString(dateTime));
}

然而,在Springboot中,默認提供了ObjectMapper,我又不想自定義。

Springboot中使用

同樣把上述jar加入依賴。然后修改配置文件,新增

spring:
  jackson:
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false

這樣可以直接使用LocalDate,不用單獨JsonFormat就可以實現自己的功能了。

LocalDateTime序列化

@Configuration
public class LocalDateTimeSerializerConfig {
    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    @Bean
    public LocalDateTimeSerializer localDateTimeDeserializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
    }

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
    }

}

參考

原文連接:https://reflectoring.io/configuring-localdate-serialization-spring-boot/ 作者: Tom Hombergs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM