東八區(qū)springboot如何配置序列化
使用SpringBoot默認(rèn)配置
SpringBoot默認(rèn)使用UTC時(shí)間,如果我們需要使用東八區(qū)時(shí)間,可以使用以下配置:
spring: jackson: time-zone: GMT+8
這種方式是最簡(jiǎn)單的方式,不需要任何額外的依賴和代碼,但是需要注意的是,該配置是全局生效的,可能會(huì)影響到其他需要使用UTC時(shí)間的地方,而且每次新增依賴、升級(jí)SpringBoot版本等情況都需要再次檢查該配置是否正確。
自定義配置類
另外一種方式是自定義配置類,使用@Configuration注解創(chuàng)建一個(gè)配置類,然后在該類中配置Jackson2ObjectMapperBuilderCustomizer,指定時(shí)區(qū)為東八區(qū)。
@Configuration public class JacksonConfiguration { ? ? @Bean ? ? public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { ? ? ? ? return builder -> builder.timeZone(TimeZone.getTimeZone("GMT+8")); ? ? } }
這種方式需要自定義代碼,但是可以更加靈活地控制使用東八區(qū)時(shí)間的范圍,而且不會(huì)影響到其他需要使用UTC時(shí)間的地方。但是同樣需要注意每次新增依賴、升級(jí)SpringBoot版本等情況都需要再次檢查該配置是否正確。
自定義 ObjectMapper
也可以通過(guò)自定義 Jackson 的 ObjectMapper 來(lái)使用東八區(qū)時(shí)間。
具體實(shí)現(xiàn)方式是,在 ObjectMapper 上設(shè)置一個(gè)自定義的 JavaTimeModule,然后在該模塊上設(shè)置時(shí)區(qū)為東八區(qū)。
示例代碼如下:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; public class CustomObjectMapper extends ObjectMapper { ? ? public CustomObjectMapper() { ? ? ? ? JavaTimeModule javaTimeModule = new JavaTimeModule(); ? ? ? ? javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); ? ? ? ? javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); ? ? ? ? this.registerModule(javaTimeModule); ? ? ? ? this.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); ? ? } }
在上面的示例中,我們創(chuàng)建了一個(gè)繼承自 ObjectMapper 的 CustomObjectMapper,并在該對(duì)象上注冊(cè)了一個(gè)自定義的 JavaTimeModule,該模塊的序列化和反序列化方式分別使用了 LocalDateTimeSerializer 和 LocalDateTimeDeserializer,同時(shí)將時(shí)區(qū)設(shè)置為 Asia/Shanghai。你也可以根據(jù)需要添加其他的時(shí)間序列化和反序列化方式。
在代碼中使用自定義的 CustomObjectMapper 對(duì)象進(jìn)行序列化和反序列化即可使用東八區(qū)時(shí)間。例如:
CustomObjectMapper objectMapper = new CustomObjectMapper(); String jsonString = objectMapper.writeValueAsString(yourObject); YourObject deserializedObject = objectMapper.readValue(jsonString, YourObject.class);
值得注意的是,如果你需要在 Spring Boot 中使用自定義的 ObjectMapper,則需要在配置類中進(jìn)行相關(guān)配置:
@Configuration public class JacksonConfig { ? ? @Bean ? ? public ObjectMapper objectMapper() { ? ? ? ? return new CustomObjectMapper(); ? ? } }
這樣配置之后,在代碼中使用 @Autowired 注入該 ObjectMapper 對(duì)象即可
自定義序列化器
第三種方式是自定義序列化器,在序列化的過(guò)程中將時(shí)間轉(zhuǎn)換為東八區(qū)時(shí)間。需要實(shí)現(xiàn)JsonSerializer接口,然后在@JsonSerialize注解中指定該序列化器。具體代碼如下:
public class ChinaZoneDateTimeSerializer extends JsonSerializer<ZonedDateTime> { ? ? @Override ? ? public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { ? ? ? ? gen.writeString(value.withZoneSameInstant(ZoneId.of("GMT+8")).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); ? ? } }
然后在需要序列化的對(duì)象的時(shí)間字段上使用@JsonSerialize注解,指定該序列化器。
@JsonSerialize(using = ChinaZoneDateTimeSerializer.class) private ZonedDateTime createTime;
這種方式可以更加靈活地控制時(shí)間的格式和轉(zhuǎn)換邏輯,但是需要自定義代碼,而且對(duì)每個(gè)需要轉(zhuǎn)換的時(shí)間字段都需要添加@JsonSerialize注解,有一定的代碼侵入性。
總結(jié)
對(duì)于使用東八區(qū)時(shí)間的配置,不同的方式各有優(yōu)劣,具體如下:
在代碼中手動(dòng)指定時(shí)區(qū)
優(yōu)點(diǎn):簡(jiǎn)單明了,沒有額外的依賴
缺點(diǎn):每次使用時(shí)都需要手動(dòng)指定時(shí)區(qū),不便于維護(hù)和修改。
在 Spring Boot 的 application.properties/yaml 中配置
優(yōu)點(diǎn):配置簡(jiǎn)單,在代碼中直接使用自動(dòng)裝配的組件即可
缺點(diǎn):如果有多個(gè)模塊需要使用不同的時(shí)區(qū),需要在不同的模塊中分別進(jìn)行配置
自定義 Jackson 的 ObjectMapper
優(yōu)點(diǎn):在多個(gè)模塊中都可以使用同一種方式來(lái)進(jìn)行配置,方便維護(hù)和修改
缺點(diǎn):需要額外的依賴,并且需要對(duì) Jackson 的序列化和反序列化機(jī)制有一定的了解。
綜上所述,三種方式各有優(yōu)缺點(diǎn),需要根據(jù)實(shí)際需求和情況選擇合適的方式。若是只需要使用全局東八區(qū)時(shí)間,可以選擇使用SpringBoot默認(rèn)配置;若是需要更加靈活地控制使用東八區(qū)時(shí)間的范圍,可以選擇自定義配置類;若是需要更加靈活地控制時(shí)間的格式和轉(zhuǎn)換邏輯,可以選擇自定義序列化器。
到此這篇關(guān)于東八區(qū)springboot如何配置序列化的文章就介紹到這了,更多相關(guān)springboot配置序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot結(jié)合Redis實(shí)現(xiàn)序列化的方法詳解
- SpringBoot之Json的序列化和反序列化問題
- springboot jackson自定義序列化和反序列化實(shí)例
- SpringBoot中時(shí)間類型 序列化、反序列化、格式處理示例代碼
- SpringBoot2.3整合redis緩存自定義序列化的實(shí)現(xiàn)
- SpringBoot 如何實(shí)現(xiàn)自定義Redis序列化
- 解決SpringBoot下Redis序列化亂碼的問題
- SpringBoot實(shí)現(xiàn)子類的反序列化示例代碼
- Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解
相關(guān)文章
springboot?實(shí)戰(zhàn):異常與重定向問題
這篇文章主要介紹了springboot實(shí)戰(zhàn):異常與重定向問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12深入淺析Java中普通代碼塊、構(gòu)造代碼塊與靜態(tài)代碼塊
這篇文章主要介紹了Java中普通代碼塊、構(gòu)造代碼塊與靜態(tài)代碼塊的相關(guān)資料,靜態(tài)代碼塊>Main()>構(gòu)造代碼塊 。非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Springboot中攔截GET請(qǐng)求獲取請(qǐng)求參數(shù)驗(yàn)證合法性核心方法
這篇文章主要介紹了Springboot中攔截GET請(qǐng)求獲取請(qǐng)求參數(shù)驗(yàn)證合法性,在Springboot中創(chuàng)建攔截器攔截所有GET類型請(qǐng)求,獲取請(qǐng)求參數(shù)驗(yàn)證內(nèi)容合法性防止SQL注入,這種方法適用攔截get類型請(qǐng)求,需要的朋友可以參考下2023-08-08在JPA中criteriabuilder使用or拼接多個(gè)like語(yǔ)句
這篇文章主要介紹了在JPA中criteriabuilder使用or拼接多個(gè)like語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12解決spring.thymeleaf.cache=false不起作用的問題
這篇文章主要介紹了解決spring.thymeleaf.cache=false不起作用的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06攜程Apollo(阿波羅)安裝部署以及java整合實(shí)現(xiàn)
這篇文章主要介紹了攜程Apollo(阿波羅)安裝部署以及java整合實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08SpringMVC @RequestBody屬性名大寫字母注入失敗的解決
這篇文章主要介紹了SpringMVC @RequestBody屬性名大寫字母注入失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類的理解
這篇文章主要介紹了對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類的理解,需要的朋友可以參考下2016-01-01