刚刚开通了一个公众号,会分享一些技术博客和自己觉得比较好的项目,同时会更新一些自己使用的工具和图书资料,后面会整理一些面试资料进行分享,觉得有兴趣的可以关注一下。
前言
在开发需求过程中,定义字段为LocalDateTime
,返回的序列化字段是按照LocalDateTime.toString
返回的,返回的字符串带一个’T’,在application.properties
里面统一配置的时间格式化是不生效的。
spring.jackson.dateFormat
,这个值是针对Date
类型的,可以在配置类里面看。而且默认的格式其实是我们需要的
解决
其实有两种方法,第一种就是在字段上加一个 @JsonFormat(pattern = "")
,这样也可以实现,但是系统上不可能只有这一个字段。
所以只能采用第二种,统一配置。
看Jackson
的配置,底层实际使用的就是ObjectMapper
,在JacksonAutoConfiguration
类里面配置。
@Bean
@Primary
@ConditionalOnMissingBean
ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
}
@Bean
@Scope("prototype")
@ConditionalOnMissingBean
Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(ApplicationContext applicationContext,
List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.applicationContext(applicationContext);
customize(builder, customizers);
return builder;
}
private void customize(Jackson2ObjectMapperBuilder builder,
List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) {
customizer.customize(builder);
}
}
最关键的其实就是这个builder
,里面有一个modules
的方法可以帮我们添加新的module
,对于LocalDatetime
的序列化。既然builder
已经配置了,我们是可以直接拿的到的。
直接上代码:
@Bean
ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
Jackson2ObjectMapperBuilder xmlMapper = builder.createXmlMapper(false);
builder.modules(list -> list.add(new LocalDateTimeModule()));
return xmlMapper.build();
}
private class LocalDateTimeModule extends SimpleModule {
public LocalDateTimeModule() {
addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}