項目背景:springboot 2.1.8release
application.properties配置:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
postgres數據庫類型:create_time timestamp
實體類型:
@TableFiled
private LocalDateTime createTime;
查詢結果:
'createTime':''2020-04-14 19:58:55.764'
納尼?不應該是:‘createTime’:‘2020-04-14T19:58:55.764’?爲什麼?
spring.jackson.date-formate='yyyy-MM-dd HH:mm:ss'爲什麼沒生效呢???
查閱資料得知:
1·、jdk8的LocalDaeTime LocalDate LocalTime默認序列化和反序列化是toString(),而Date timestamp有各自的序列化和反序列化處理類。
2、spring.jackson.date-formate='yyyy-MM-dd HH:mm:ss'只針對於Date timestamp類型有效。
那麼怎麼解決這個問題呢?重寫jackson的關於LocalDateTime LocalTime LocalDate的序列化和反序列化的處理類。
具體的解決方案如下;
package com.skyeye.config;
import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* format LocalDateTime LocalDate LocalTime
*
* @author Jiantao Li
* @date 2020/4/15 11:04
*/
@Configuration
public class LocalDateFormatConfig {
/**
* Date格式化字符串
*/
private static final String DATE_FORMAT = DatePattern.NORM_DATE_PATTERN;
/**
* DateTime格式化字符串
*/
private static final String DATETIME_FORMAT = DatePattern.NORM_DATETIME_PATTERN;
/**
* Time格式化字符串
*/
private static final String TIME_FORMAT = DatePattern.NORM_TIME_PATTERN;
@Bean
@Primary
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT)))
.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)))
.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)))
.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT)))
.deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)))
.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
}
}
重寫LocalDateTime LocalDate LocalTime的序列化和反序列化處理類。
項目中遇到的問題分享與大家。
本文完。