Springboot全局配置自动格式化日期参数,超简单直接拿去用

日常开发中,时间格式的参数出现频率非常高,很多朋友对时间格式转换也很头疼,或者只知道如何配置,而不知道这些配置如何生效的。

今天我们来梳理一下Springboot项目中配置日期转换的三种方式,以及其大致原理。

Springboot版本:2.7.6

1,全局配置(推荐)

Spring提供了默认的jackson配置,我们只需修改Spring的默认配置,自定义对于日期参数的格式化方式即可。

新建一个配置类,构建一个自定义的ObjectMapper即可全局生效。

@Configuration
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper()
                .setLocale(Locale.CHINA)
                .setTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault()))
                //注册一个序列化和反序列化的module
                .registerModule(javaTimeModule())
                //配置date格式参数的解析
                .setDateFormat(new SimpleDateFormat(DatePattern.NORM_DATETIME_PATTERN))
                .setLocale(Locale.CHINA)
                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                .findAndRegisterModules();
    }

    @Bean
    public Module javaTimeModule() {
        JavaTimeModule module = new JavaTimeModule();
        module.addSerializer(new LocalDateTimeSerializer(
                DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)
        ));
        module.addSerializer(new LocalTimeSerializer(
                DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))
        );
        module.addSerializer(new LocalDateSerializer(
                DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))
        );
        module.addDeserializer(LocalDateTime.class,
                new LocalDateTimeDeserializer(
                        DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)
                ));
        module.addDeserializer(LocalDate.class,
                new LocalDateDeserializer(
                        DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)
                ));
        module.addDeserializer(LocalTime.class,
                new LocalTimeDeserializer(
                        DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN)
                ));
        return module;
    }

}

上述中的几项配置也比较简单,大家基本可以直接看出其作用,就不再一项项细说了。

另外大家可以注意到,自定义的类上使用了@AutoConfigureBefore(JacksonAutoConfiguration.class),他的目的在于提前构建ObjectMapper,这样当JacksonAutoConfiguration初始化时,使用的就是我们自定义的ObjectMapper,我们配置的格式化参数就可以生效了。

在JacksonAutoConfiguration中静态类JacksonObjectMapperConfiguration中,

大家可以看到,当ObjectMapper已经存在时,就不会再使用Spring默认的了。

@ConditionalOnMissingBean是一个很好用的注解,大家在开发自己的组件时也可以尝试通过他实现动态的组件注册。

关于如何找到Jackson配置的启动类,有的同学可能一开始不知道如何下手。

其实很简单,我们只要知道一个类是由Spring自动配置的,那么就去Spring的autoconfigure.jar包下找就行,在org.springframework.boot.autoconfigure下面,我们可以找到Jackson的包,JacksonAutoConfiguration就在其中。

除了Jackson的配置,其他自动配置的组件也可以在autoconfigure中找到。

2,通过@JsonFormat注解转换

我们也可以在一个类的属性上使用@JsonFormat达到格式化参数的目的。

@Data
public class OutputDTO {

    private String desc;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime time;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date date;
}

这种方式可以在需要的地方自由配置格式化方式,但是相对来说会增加许多工作,建议还是使用全局配置的方式。

3,yml配置文件自定义(不推荐)

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

需要注意的是,这种方式默认只对date生效,对于java8的LocalDate,LocalDateTime是不生效的。

对于为什么不生效感兴趣的朋友可以在JacksonAutoConfiguration的内部类Jackson2ObjectMapperBuilderCustomizerConfiguration中的customize.configureDateFormat方法中找到答案。

感谢您的点赞和关注。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员拾山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值