天天看點

SpringBoot如何通過Jackson配置全局時間日期格式,這你會嗎?

1. 前言

不知道小夥伴對于日期字段,在項目中都是如何處理的,是單獨給每個字段都自定義日期格式還是做全局格式設定?這個我之前啊,是對日期都是有做單獨配置,給每個Entity帶有日期字段的都配@JsonFormat注解,具體配置如下:

kotlin複制代碼//把屬性的格式序列化時轉換成指定的格式.
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
           

這不就代碼備援了嘛;既然每個都要設定一遍,那何不如想一個能一勞永逸的方法,将全局的日期格式都統一化,自己也用不着挨個挨個去配置了,你們覺得呢?

2. 環境說明

js複制代碼環境說明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
           

3. 預設時間格式展示示範

接下來,我先為大家示範一下,寫個接口查詢log日志清單來示範一下預設的Date類型的字段内容輸出是何種樣子?我們一起拭目以待。

3.1 定義實體

先定義一個日志實體,示範代碼如下:

kotlin複制代碼/**
 * 系統日志實體
 *
 */
@Data
@TableName("log_info")
@ApiModel(value = "系統日志實體", description = "系統日志實體")
public class LogInfo {
   private static final long serialVersionUID = 1L;

   @ApiModelProperty(value = "主鍵id自增列")
   @TableId(value = "id", type = IdType.AUTO)
   private int id;

   @ApiModelProperty(value = "操作類型")
   @TableField(value = "log_type")
   private String logType;

   @ApiModelProperty(value = "接口傳回狀态碼")
   @TableField(value = "response_code")
   private int responseCode;

   @ApiModelProperty(value = "請求時間")
   @TableField(value = "operate_time")
   private Date operateTime;

   @ApiModelProperty(value = "消耗時間")
   @TableField(value = "spend_time")
   private Long spendTime;

   @ApiModelProperty(value = "url")
   @TableField(value = "url")
   private String url;

   @ApiModelProperty(value = "請求體")
   @TableField(value = "body")
   private String body;

   @ApiModelProperty(value = "ip")
   @TableField(value = "ip")
   private String ip;

   @ApiModelProperty(value = "查詢參數")
   @TableField(value = "query")
   private String query;

   @ApiModelProperty(value = "異常資訊")
   @TableField(value = "exception")
   private String exception;
}
           

3.2 定義Controller

定義一個接口,請求路徑為:"/get-logs"。

less複制代碼/**
 * 不分頁查詢所有日志
 */
@GetMapping("/get-logs")
@ApiOperation(value = "不分頁查詢所有日志", notes = "不分頁查詢所有日志")
public ResultResponse<List> getLogList() {
    return new ResultResponse<>(logInfoService.list());
}
           

接着,我們通過swagger直接請求一下,可以發現operateTime字段本是Date類型,是以不難看出,當你未處理該字段時,預設展示是Date字元串時間格式,即UTC格式。很不習慣也不友善頁面展示,是以,我們必須對該日期格式進行處理,轉成比如“yyyy-MM-dd”或者“yyyy-MM-dd HH:mm:ss”等正常時間格式,這樣看着肯定舒服多了,也是頁面能接受的日期展示格式。

SpringBoot如何通過Jackson配置全局時間日期格式,這你會嗎?

是以接下來,我就帶着大家如何來配置這個全局日期時間格式問題。

4. 配置 Jackson

在上方提到,如何一勞永逸,這不,我教你們,用到了Jackson,一個java的開源架構,一個超級好用的JSON解析類庫,包括上方提到的“@JsonFormat”,也是來自于它,至于Jackson的詳細用法,我将在下期重點介紹,此文主要帶大家如何配置全局日期格式。

4.1 jackson依賴引入

xml複制代碼<!--jackson依賴-->
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.9.1</version> 
</dependency>
           

解釋一下:jackson-databind 依賴 jackson-core 和 jackson-annotations這兩,當添加 jackson-databind 依賴之後, jackson-core 和 jackson-annotations 也會一并被引入;在添加相關依賴包之後,你就能使用 Jackson了。

注意:如果你是springboot項目,有引入spring-boot-starter-web這個starter,自然就引入了jackson包,是以大家不要重複導包啦,特此提醒!!

然後,再給大家解讀下,Jackson依賴被添加後,重新整理maven,可以看到jackson-core 和 jackson-annotations這兩都被引入進來了。具體請看如下截圖:

SpringBoot如何通過Jackson配置全局時間日期格式,這你會嗎?

4.2 Jackson配置

對于ObjectMapper類作為Jackson類的主類,我們要實作的日期格式設定也是基于它來實作的,大家請看,我們要用到這個方法setDateFormat()。

SpringBoot如何通過Jackson配置全局時間日期格式,這你會嗎?

配置JacksonConfig類,代碼實作如下:

java複制代碼package com.example.demo.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 自定義日期轉換格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        return objectMapper;
    }
}
           

4.3 測試

我們直接在JacksonConfig類中将日期格式轉成[yyyy-MM-dd HH:mm:ss],接下來,我們重新開機下項目,使配置類生效,我們再次請求該接口,接口傳回内容如下:

SpringBoot如何通過Jackson配置全局時間日期格式,這你會嗎?

可以看到,日期格式将順利寫成了我們所指定的日期格式,或許有的小夥伴可能不太笃定,湊巧嘛,可以,那我們另設定一個日期格式,具體如下修改:

arduino複制代碼//自定義時間格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
           

之後我們再重新開機項目重新請求接口,大家請看。日期格式也是按指定格式輸出。

SpringBoot如何通過Jackson配置全局時間日期格式,這你會嗎?

毫無疑問,如此設定,确實是可以針對全局是Date類型的字段進行統一日期格式轉化,使用起來非常的友善,Jackson真的超級好用,推薦給大家。

原文連結:https://juejin.cn/post/7233297607043366968

繼續閱讀