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

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

创新互联公司是专业的苍南网站建设公司,苍南接单;提供做网站、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行苍南网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

今天我们来梳理一下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方法中找到答案。

感谢您的点赞和关注。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:Springboot全局配置自动格式化日期参数,超简单直接拿去用-创新互联
URL网址:http://scyanting.com/article/cdhijc.html