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

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