欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot日期格式化全局LocalDateTime詳解

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

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

分析

從springboot:3.2.1 web 項(xiàng)目序列化響應(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項(xiàng)目中,使用從beanfactory中獲取的ObjectMapper序列化對象時,若對象的字段類型是LocalDateTime,則使用com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer對字段進(jìn)行序列化,但是其默認(rèn)的日期格式并不是我們想要的。

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

自定義日期格式(全局)

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

利用ObjectMapper#registerModule

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

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

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

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

也可以使用modulesToInstall方法

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

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

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

擴(kuò)展

利用配置文件指定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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis?like模糊查詢特殊字符報錯轉(zhuǎn)義處理方式

    mybatis?like模糊查詢特殊字符報錯轉(zhuǎn)義處理方式

    這篇文章主要介紹了mybatis?like模糊查詢特殊字符報錯轉(zhuǎn)義處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring Boot2.0整合ES5實(shí)現(xiàn)文章內(nèi)容搜索實(shí)戰(zhàn)

    Spring Boot2.0整合ES5實(shí)現(xiàn)文章內(nèi)容搜索實(shí)戰(zhàn)

    這篇文章主要介紹了Spring Boot2.0整合ES5實(shí)現(xiàn)文章內(nèi)容搜索實(shí)戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 一文詳解SpringMVC中的@RequestMapping注解

    一文詳解SpringMVC中的@RequestMapping注解

    @RequestMapping是一個用于映射HTTP請求到處理方法的注解,在Spring框架中使用,它可以用于控制器類和處理方法上,用來指定處理不同URL路徑的請求,并定義請求的方法等,本文小編將給大家詳細(xì)的介紹一下SpringMVC中的@RequestMapping注解,需要的朋友可以參考下
    2023-08-08
  • Java開發(fā)或調(diào)用WebService的幾種方式總結(jié)

    Java開發(fā)或調(diào)用WebService的幾種方式總結(jié)

    java開發(fā)過程中,很多地方都會遇到數(shù)據(jù)傳遞,遠(yuǎn)程獲取數(shù)據(jù)問題,這篇文章主要介紹了Java開發(fā)或調(diào)用WebService的幾種方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 詳解SpringBoot?調(diào)用外部接口的三種方式

    詳解SpringBoot?調(diào)用外部接口的三種方式

    SpringBoot不僅繼承了Spring框架原有的優(yōu)秀特性,而且還通過簡化配置來進(jìn)一步簡化了Spring應(yīng)用的整個搭建和開發(fā)過程,這篇文章主要介紹了SpringBoot?調(diào)用外部接口的三種方式,需要的朋友可以參考下
    2023-04-04
  • SpringBoot文件上傳同時接收復(fù)雜參數(shù)的過程詳解

    SpringBoot文件上傳同時接收復(fù)雜參數(shù)的過程詳解

    這篇文章主要介紹了SpringBoot文件上傳同時,接收復(fù)雜參數(shù),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)實(shí)例詳解

    SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • 詳解如何實(shí)現(xiàn)OpenAPI開發(fā)動態(tài)處理接口的返回數(shù)據(jù)

    詳解如何實(shí)現(xiàn)OpenAPI開發(fā)動態(tài)處理接口的返回數(shù)據(jù)

    這篇文章主要為大家介紹了OpenAPI開發(fā)動態(tài)處理接口的返回數(shù)據(jù)如何實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java?OpenCV圖像處理之自定義圖像濾波算子

    Java?OpenCV圖像處理之自定義圖像濾波算子

    這篇文章主要為大家介紹了如何利用Java?OpenCV實(shí)現(xiàn)自定義圖像濾波(降噪)?算子,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-02-02
  • Java中main函數(shù)的String[]?args用法舉例詳解

    Java中main函數(shù)的String[]?args用法舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中main函數(shù)的String[]?args用法的相關(guān)資料,JAVA類中main函數(shù)的參數(shù)String[]?args指的是運(yùn)行時給main函數(shù)傳遞的參數(shù),文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12

最新評論