1. 程式人生 > 實用技巧 >springboot中的resttemplate使用了jackson序列化遇到的坑

springboot中的resttemplate使用了jackson序列化遇到的坑

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

springboot之restTemplate學習

SpringBoot系列: RestTemplate 快速入門 - harrychinese - 部落格園 (cnblogs.com)

由於springboot預設使用jackson做序列化,但是jackson序列化按照的是GMT時區的時間。中國是GTM+8小時,所以原本在中國是2020-11-28 19:00:00,序列化到前端就是2020-11-28 12:00:00

就是說北京時間晚上19點的時候,倫敦才中午12點。

解決返回前端的日期欄位少了8小時,可以通過入下三種方式,

一:所有日期欄位加上時區

@JsonFormat(
    pattern = "yyyy-MM-dd HH:mm:ss",
    timezone = "GMT+8"
)
private Date date;

二:springboot配置檔案中統一配置

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

三:通過配置類的方式:

@Configuration
public class TimeZoneConfiguration {
    @Bean
    
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("GMT+8")); } }

前端的展示時間的問題解決了,但是後端的問題並沒有解決,一次偶然中發現,微服務consumer呼叫微服務provider的時候,傳過去的時間也少了8個小時。

排查後發現使用springboot的RestTemplate請求去呼叫服務的時候,也會進行jackson序列化,此時上面三種方式,二和三都失效了,序列化的時候都不會幫我們+8小時,

只有在每個欄位上面加上時區標識才有效

timezone = "GMT+8"