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

springboot日期格式化全局LocalDateTime詳解

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

springboot 默認使用ObjectMapper(jackson)操作對象的序列化和反序列化

分析

從springboot:3.2.1 web 項目序列化響應(yīng)體的過程中分析日期格式化問題(左側(cè)是請求處理流程,右側(cè)是在流程中使用的一些對象的來源)

ObjectMapper與JsonSerializer

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

創(chuàng)建ObjectMapper對象

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

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

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

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

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的對應(yīng)關(guān)系

結(jié)論

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

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

自定義日期格式(全局)

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

利用ObjectMapper#registerModule

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

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

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

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

也可以使用modulesToInstall方法

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

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

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

擴展

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

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

這種方式對java.time.LocalDateTime類型無效

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

@JsonFormat,對java.util.Datejava.time.LocalDateTime都有效

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

總結(jié)

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

相關(guān)文章

  • Token過期實現(xiàn)自動續(xù)期的方法步驟

    Token過期實現(xiàn)自動續(xù)期的方法步驟

    本文詳細解析了Token在防止表單重復提交、身份驗證及過期處理中的應(yīng)用,涵蓋Token的生成流程、過期機制及續(xù)期方案,特別介紹了單token與雙token兩種策略,需要的朋友可以參考下
    2026-05-05
  • Java基礎(chǔ)之內(nèi)部類與代理知識總結(jié)

    Java基礎(chǔ)之內(nèi)部類與代理知識總結(jié)

    今天帶大家復習Java的基礎(chǔ)知識,文中有非常詳細的介紹及圖文示例,對正在學習Java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 深入理解JAVA多線程之線程間的通信方式

    深入理解JAVA多線程之線程間的通信方式

    下面小編就為大家?guī)硪黄钊肜斫釰AVA多線程之線程間的通信方式。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • SpringBoot中Package打包的實現(xiàn)小結(jié)

    SpringBoot中Package打包的實現(xiàn)小結(jié)

    本文詳細介紹了將SpringBoot項目打包成jar或war,包括jar的默認打包、war的內(nèi)嵌tomcat排除和配置,以及部署到外部Tomcat的步驟,適合開發(fā)者理解和實踐項目部署,感興趣的可以了解一下
    2026-03-03
  • Spring MVC簡介_動力節(jié)點Java學院整理

    Spring MVC簡介_動力節(jié)點Java學院整理

    Spring MVC屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow里面。今天先從寫一個Spring MVC的HelloWorld開始,讓我們看看如何搭建起一個Spring mvc的環(huán)境并運行程序,感興趣的朋友一起學習吧
    2017-08-08
  • java隨機驗證碼生成實現(xiàn)實例代碼

    java隨機驗證碼生成實現(xiàn)實例代碼

    這篇文章主要介紹了java隨機驗證碼生成實現(xiàn)實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • spring事務(wù)里面開啟線程插入報錯了是否會回滾

    spring事務(wù)里面開啟線程插入報錯了是否會回滾

    這篇文章主要介紹了spring事務(wù)里面開啟線程插入,報錯了是否會回滾?這是小編遇到一道面試題,題目大概是這個樣子,今天抽空通過示例代碼給大家分析下,需要的朋友可以參考下
    2023-04-04
  • java實現(xiàn)文件夾解壓和壓縮

    java實現(xiàn)文件夾解壓和壓縮

    這篇文章主要為大家詳細介紹了java實現(xiàn)文件夾解壓和壓縮,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 一文詳解Spring如何控制Bean注入的順序

    一文詳解Spring如何控制Bean注入的順序

    這篇文章主要為大家詳細介紹Spring如何控制Bean注入的順序,其中續(xù)注意的是在Bean上加@Order(xxx)是無法控制bean注入的順序的,需要的可以參考一下
    2022-06-06
  • Java中Integer類常用靜態(tài)方法實例詳解

    Java中Integer類常用靜態(tài)方法實例詳解

    在Java編程中Integer類是int基本類型的封裝類,提供了許多方便的功能,這篇文章主要介紹了Java中Integer類常用靜態(tài)方法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-07-07

最新評論

孟州市| 平安县| 深州市| 汝州市| 赣州市| 玛沁县| 花莲县| 教育| 当雄县| 安康市| 藁城市| 玛纳斯县| 襄垣县| 孟村| 翁源县| 博湖县| 灵寿县| 临泽县| 崇阳县| 苍溪县| 汉沽区| 偃师市| 渭南市| 南陵县| 卢氏县| 旺苍县| 商都县| 民县| 华容县| 祁连县| 龙游县| 黄陵县| 图片| 长治县| 福海县| 东至县| 兴宁市| 枞阳县| 木兰县| 富宁县| 鸡西市|