SpringBoot中java8的java.time.LocalDateTime類JsonFormat說明

問題概述

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章