最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot日期格式化全局LocalDateTime詳解

 更新時(shí)間:2025年02月11日 08:57:18   作者:只俗不凡  
文章主要分析了Spring Boot中ObjectMapper對(duì)象的序列化和反序列化過(guò)程,并具體探討了日期格式化問(wèn)題,通過(guò)分析Spring Boot的自動(dòng)配置類JacksonAutoConfiguration,文章詳細(xì)說(shuō)明了ObjectMapper對(duì)象的創(chuàng)建和配置過(guò)程

springboot 默認(rèn)使用ObjectMapper(jackson)操作對(duì)象的序列化和反序列化

分析

從springboot:3.2.1 web 項(xiàng)目序列化響應(yīng)體的過(guò)程中分析日期格式化問(wèn)題(左側(cè)是請(qǐng)求處理流程,右側(cè)是在流程中使用的一些對(duì)象的來(lái)源)

ObjectMapper與JsonSerializer

根據(jù)上述流程可知,序列化響應(yīng)結(jié)果時(shí)使用的ObjectMapper對(duì)象是由自動(dòng)配置類JacksonAutoConfiguratioin.JacksonObjectMapperConfiguration使用Jackson2ObjectMapperBuilder創(chuàng)建,并注冊(cè)到beanfactory中。

創(chuàng)建ObjectMapper對(duì)象

設(shè)置ObjectMapper對(duì)象的屬性

Jackson2ObjectMapperBuilder#build方法中創(chuàng)建了ObjectMapper對(duì)象,然后在Jackson2ObjectMapperBuilder#configure方法中對(duì)ObjectMapper對(duì)象設(shè)置了一些屬性。

例如創(chuàng)建JavaTimeModule對(duì)象并將其注冊(cè)給ObjectMapper, 正是在JavaTimeModule的構(gòu)造方法中指定了LocalDateTime的序列化器使用com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer,并將這種關(guān)系使用ObjectMapper#registerModules注冊(cè)給ObjectMapper對(duì)象

在以下方法中創(chuàng)建了com.fasterxml.jackson.datatype.jsr310.JavaTimeModule對(duì)象

private void registerWellKnownModulesIfAvailable(MultiValueMap<Object, Module> modulesToRegister) {
        // ...
		try {
			Class<? extends Module> javaTimeModuleClass = (Class<? extends Module>)
					ClassUtils.forName("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule", this.moduleClassLoader);
			Module javaTimeModule = BeanUtils.instantiateClass(javaTimeModuleClass);
			modulesToRegister.set(javaTimeModule.getTypeId(), javaTimeModule);
		}
		catch (ClassNotFoundException ex) {
			// jackson-datatype-jsr310 not available
		}
		// ...
	}

在JavaTimeModule類的構(gòu)造函數(shù)中設(shè)置了LocalDateTime類型和該類型使用的序列化器LocalDateTimeSerializer和反序列化器LocalDateTimeDeserializer的對(duì)應(yīng)關(guān)系

結(jié)論

springboot項(xiàng)目中,使用從beanfactory中獲取的ObjectMapper序列化對(duì)象時(shí),若對(duì)象的字段類型是LocalDateTime,則使用com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer對(duì)字段進(jìn)行序列化,但是其默認(rèn)的日期格式并不是我們想要的。

因此需要干涉上述流程,使用自定義的日期時(shí)間格式

自定義日期格式(全局)

1.直接操作spring容器中的ObjectMapperbean

利用ObjectMapper#registerModule

2.自定義容器中的Jackson2ObjectMapperBuilderbean,達(dá)到間接操作ObjectMapper的目的

從流程圖中可知,容器中的ObjectMapper對(duì)象由Jackson2ObjectMapperBuilder創(chuàng)建(創(chuàng)建者模式),因此自定義Jackson2ObjectMapperBuilder的屬性,會(huì)間接作用到ObjectMapper的屬性

根據(jù)JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration源碼可知,創(chuàng)建一個(gè)Jackson2ObjectMapperBuilderCustomizer實(shí)現(xiàn)類,并將其注入到容器中,可對(duì)容器中的Jackson2ObjectMapperBuilder bean進(jìn)行自定義配置

按照上述思路實(shí)現(xiàn)如下(真實(shí)工作中需考慮多個(gè)customizer的順序)

也可以使用modulesToInstall方法

3.向容器中注入com.fasterxml.jackson.databind.Module的實(shí)現(xiàn)類

這是因?yàn)閟pringboot自動(dòng)配置包中已經(jīng)提供了一個(gè)Jackson2ObjectMapperBuilderCustomizer實(shí)現(xiàn)類,在創(chuàng)建該實(shí)現(xiàn)類對(duì)象時(shí),它將從容器中獲取的com.fasterxml.jackson.databind.Modulebean用于自定義配置Jackson2ObjectMapperBuilder

同時(shí),可以看到StandardJackson2ObjectMapperBuilderCustomizer類使用了JacksonProperties的配置,也就說(shuō)可以在配置文件中做些定義的配置

擴(kuò)展

利用配置文件指定java.util.Date類型的格式化

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

這種方式對(duì)java.time.LocalDateTime類型無(wú)效

利用注解指定時(shí)間格式化(局部)

@JsonFormat,對(duì)java.util.Datejava.time.LocalDateTime都有效

  • @JsonSerialize、@JsonDeserialize,指定使用的序列化器
  • @DateTimeFormat
  • @JsonComponent

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

友谊县| 闽清县| 尚义县| 孟州市| 乌拉特中旗| 阳原县| 交城县| 应用必备| 赣州市| 克山县| 楚雄市| 徐闻县| 海宁市| 紫阳县| 宁海县| 色达县| 霍林郭勒市| 义乌市| 双柏县| 榆社县| 新昌县| 阿拉尔市| 柞水县| 清水河县| 丁青县| 得荣县| 蒲江县| 深圳市| 江安县| 红原县| 莱西市| 南城县| 松溪县| 云林县| 东城区| 宾川县| 清丰县| 武川县| 水富县| 招远市| 页游|