問題概述
在SpringBoot中,需要對java8的java.time.LocalDateTime類進行個性化的JsonFormat。
處理前,默認處理的日期-時間效果
"create_time": {
"year": 2019,
"month": "JUNE",
"month_value": 6,
"day_of_month": 27,
"hour": 17,
"minute": 40,
"second": 43,
"nano": 503000000,
"day_of_week": "THURSDAY",
"day_of_year": 178,
"chronology": {
"id": "ISO",
"calendar_type": "iso8601"
}
}
想要實現的效果
"create_time": "2019-06-27 17:40:43.503"
處理過程說明
1. 添加jackson-datatype-jsr310
的引用
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.0</version>
</dependency>
2. 在Java屬性上添加@JsonSerialize
和@JsonFormat
註解說明
/**
* 創建時間
*/
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
@Column(name = "create_time")
private LocalDateTime createTime = LocalDateTime.now();
SpringBoot全局序列化配置
這時,可能有朋友會說:每個LocalDateTime,我都想按照固定的格式來進行Json序列化,一個一個實體類去加註解,豈不是很麻煩?
別急,接下來我們來說一下全局配置:
需要在添加了@Configuration
註解的配置類中,添加如下代碼:
/**
* 統一json輸出風格
* See {@link com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy} for details.
* @param converters
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (int i = 0; i < converters.size(); i++) {
if (converters.get(i) instanceof StringHttpMessageConverter) {
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charsets.UTF_8);
stringHttpMessageConverter.setWriteAcceptCharset(false);
converters.set(i, stringHttpMessageConverter);
}
if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule("JsonMapSerializer", Version.unknownVersion());
// 對LocalDateTime類,提供統一的序列化方式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
simpleModule.addSerializer(new LocalDateTimeSerializer(dateTimeFormatter));
objectMapper.registerModule(simpleModule);
// 統一返回數據的輸出風格
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategy.SnakeCaseStrategy());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper);
converters.set(i, converter);
break;
}
}
}
然後,在具體類的成員變量上,就不用添加@JsonSerialize
和@JsonFormat
註解了。
參考:stackoverflow:JSON Java 8 LocalDateTime format in Spring Boot
stackoverflow:Serialize LocalDateTime with only milliseconds with Jackson