首頁  >  文章  >  Java  >  SpringBoot中處理日期的方式有哪些

SpringBoot中處理日期的方式有哪些

PHPz
PHPz轉載
2023-05-16 14:58:061414瀏覽

在Spring Boot中,我們通常會使用Jackson來序列化和反序列化Java物件到JSON。在進行日期序列化時,我們需要指定日期格式,否則Jackson會使用預設格式,這可能不是我們想要的。要指定日期格式,有兩種方式:

如果沒有處理按照預設的結果如下圖: 所以我們需要通過一些手段來對日期進行處理.這裡通過兩個方式來解決.

SpringBoot中處理日期的方式有哪些

方式一: 使用註解(不推薦)

我們可以在實體類別日期屬性上新增@JsonFormat(),並且透過參數pattern,來格式化我們的想要的格式實例如下:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

此時前端就會按照我們設定的格式顯示

SpringBoot中處理日期的方式有哪些

#對於上面的方法,需要我們對每一個向前端顯示的日期都加上@JSONFormat這個註解,所以十分的麻煩,於是就有了方式二.透過全域異常處理.

方式二自訂訊息轉換器

首先介紹Jackson套件中的ObjectMapper.

ObjectMapper是Jackson庫中的一個類別,它的主要作用是:

  • 將Java物件序列化為JSON/XML等格式;

  • 將JSON/XML等格式的資料反序列化為Java物件。

所以,它是實作物件與JSON/XML互相轉換的關鍵。

那麼我們可以在這個類別中做一點文章,

(1)在建構器中自訂日期轉換的格式. ----也就相當於改變他的屬性的初始化值.

(2)透過配置讓SpringMVC在呼叫的時候不再呼叫Jackson自訂的ObjectMapper,使用我們自定的格式

下面我們就透過這兩步驟實作.

第一步: 繼承ObjectMapper,重寫建構方法,自訂序列化方式

public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

第二步: 讓Spring使用我們的自定的消息轉換器

這裡我們就要想了,我們該怎麼處理呢?在哪配置?配置文件? 配置類?

首先我們可以想到,系統中少不了的是攔截器,而攔截器的是不是有一個配置攔截規則的配置類別.那麼我們能不能再這裡配置.

binggo,就是這裡. 我們在配置攔截器的配置類別的時候我們會發現, WebMvcConfigurationSupport 這個類別有很多方法,

有我們常用的protected void addInterceptors(InterceptorRegistry registry) { ... } 設定攔截規則

public void addResourceHandlers(ResourceHandlerRegistry registry) {... } 設定資源處理

等等有很多設定方法.而我們的訊息轉換器也在其中

protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {...}

透過在這個方法中配置相關資訊,即可改變Spring預設指定的規則,而使用我們自己定義的規則(元件)

程式碼如下:

@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.info("扩展消息转换器...");
    //创建一个消息转换器对象,注意不要导错包是Jackson2Http
    MappingJackson2HttpMessageConverter converter =  new MappingJackson2HttpMessageConverter();
    //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
    converter.setObjectMapper(new JacksonObjectMapper());
    //将自己的消息转化器加入容器中
    converters.add(0, converter);
}
  • 建立了一個MappingJackson2HttpMessageConverter,這是Spring MVC整合Jackson的訊息轉換器,可以將Java物件序列化/反序列化為JSON。

  • 為訊息轉換器指定使用我們的JacksonObjectMapper, 用來將Java物件序列化/反序列化為JSON。

  • 將剛才建立的MappingJackson2HttpMessageConverter物件加入到訊息轉換器清單converters中,並且加入到第一個位置,讓其優先使用

#由於我們重寫了extendMessageConverters()方法,Spring MVC會呼叫這個方法並使用我們新增的訊息轉換器。所以,我們新增的MappingJackson2HttpMessageConverter會生效,並使用我們自訂的JacksonObjectMapper(),用來處理物件與JSON之間的序列化和反序列化。

因為我們的訊息轉換器是第一個訊息轉換器,如果客戶端要求回傳JSON資料Spring MVC會選擇我們的這個訊息轉換器進行物件序列化。

從而實現了對系統所有的日期按照我們要求的格式進行序列化.

此時前端資料也就是我們設定的格式.不在是Jackson預設的格式.

既然提到了日期,與之類似的還有一個對敏感資訊的處理:

我們在返回前端資料的時候可能會因為實體類別的設計,或者不想讓前端能夠看到該資料,此時就需要透過一些手段對資料進行一些處理, 還是兩種方式.

  • #在傳回之前對資料的值進行替換, 呼叫set方法設定為垃圾訊息, 例如setPassword(“******”)

  • 是在實體類別中使用Jackson提供的 @JsonIgnore 註解也可以解決,作用是忽略字段的序列化和反序列化。

#

以上是SpringBoot中處理日期的方式有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除