前言
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
