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

解決Spring Boot和Feign中使用Java 8時間日期API(LocalDate等)的序列化問題

 更新時間:2018年03月14日 09:06:17   投稿:mrr  
這篇文章主要介紹了解決Spring Boot和Feign中使用Java 8時間日期API(LocalDate等)的序列化問題,需要的朋友可以參考下

LocalDate 、 LocalTime 、 LocalDateTime 是Java 8開始提供的時間日期API,主要用來優(yōu)化Java 8以前對于時間日期的處理操作。然而,我們在使用Spring Boot或使用Spring Cloud Feign的時候,往往會發(fā)現使用請求參數或返回結果中有 LocalDate 、 LocalTime 、 LocalDateTime 的時候會發(fā)生各種問題。本文我們就來說說這種情況下出現的問題,以及如何解決。

問題現象

先來看看癥狀。比如下面的例子:

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
  @RestController
  class HelloController {
    @PostMapping("/user")
    public UserDto user(@RequestBody UserDto userDto) throws Exception {
      return userDto;
    }
  }
  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  static class UserDto {
    private String userName;
    private LocalDate birthday;
  }
}

上面的代碼構建了一個簡單的Spring Boot Web應用,它提供了一個提交用戶信息的接口,用戶信息中包含了 LocalDate 類型的數據。此時,如果我們使用Feign來調用這個接口的時候,會得到如下錯誤:

2018-03-13 09:22:58,445 WARN [http-nio-9988-exec-3] org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: java.io.PushbackInputStream@67064c65; line: 1, column: 63] (through reference chain: java.util.ArrayList[0]->com.didispace.UserDto["birthday"])

分析解決

對于上面的錯誤信息 JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value ,熟悉Spring MVC的童鞋應該馬上就能定位錯誤與 LocalDate 的反序列化有關。但是,依然會有很多讀者會被這段錯誤信息 java.util.ArrayList[0]->com.didispace.UserDto["birthday"] 所困惑。我們命名提交的 UserDto["birthday"] 是個 LocalDate 對象嘛,跟 ArrayList 列表對象有啥關系呢?

我們不妨通過postman等手工發(fā)一個請求看看服務端返回的是什么?比如你可以按下圖發(fā)起一個請求:

 

從上圖中我們就可以理解上面我所提到的困惑了,實際上默認情況下Spring MVC對于 LocalDate 序列化成了一個數組類型,而Feign在調用的時候,還是按照 ArrayList 來處理,所以自然無法反序列化為 LocalDate 對象了。

解決方法

為了解決上面的問題非常簡單,因為jackson也為此提供了一整套的序列化方案,我們只需要在 pom.xml 中引入 jackson-datatype-jsr310 依賴,具體如下:

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

注意:在設置了spring boot的parent的情況下不需要指定具體的版本,也不建議指定某個具體版本

在該模塊中封裝對Java 8的時間日期API序列化的實現,其具體實現在這個類中: com.fasterxml.jackson.datatype.jsr310.JavaTimeModule (注意:一些較早版本瘋轉在這個類中“ com.fasterxml.jackson.datatype.jsr310.JSR310Module )。在配置了依賴之后,我們只需要在上面的應用主類中增加這個序列化模塊,同時開啟標準的 ISO 8601 格式:

@Bean
public ObjectMapper serializingObjectMapper() {
  ObjectMapper objectMapper = new ObjectMapper();
  objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
  objectMapper.registerModule(new JavaTimeModule());
  return objectMapper;
}

此時,我們在訪問剛才的接口,就不再是數組類型了,同時對于Feign客戶端的調用也不會再出現上面的錯誤了。

代碼示例

本文的相關例子可以查看下面?zhèn)}庫中的 Chapter3-1-7 目錄:

Github:https://github.com/dyc87112/SpringBoot-Learning

Gitee:https://gitee.com/didispace/SpringBoot-Learning

總結

以上所述是小編給大家介紹的解決Spring Boot和Feign中使用Java 8時間日期API(LocalDate等)的序列化問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • Java排序之冒泡排序的實現與優(yōu)化

    Java排序之冒泡排序的實現與優(yōu)化

    冒泡排序是一種簡單的交換排序。之所以叫做冒泡排序,因為我們可以把每個元素當成一個小氣泡,根據氣泡大小,一步一步移動到隊伍的一端,最后形成一定對的順序。本文將利用Java實現冒泡排序,并進行一定的優(yōu)化,希望對大家有所幫助
    2022-11-11
  • 圖片驗證碼概述及實現步驟

    圖片驗證碼概述及實現步驟

    本文主要介紹了圖片驗證碼概述及實現步驟。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Java Lambda表達式之從集合到流

    Java Lambda表達式之從集合到流

    這篇文章主要介紹了Java Lambda表達式之從集合到流知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • springboot注冊攔截器所遇到的問題

    springboot注冊攔截器所遇到的問題

    這篇文章主要介紹了springboot注冊攔截器的方法及所遇到的問題,需要的朋友可以參考下
    2018-07-07
  • spring cloud gateway 限流的實現與原理

    spring cloud gateway 限流的實現與原理

    這篇文章主要介紹了spring cloud gateway 限流的實現與原理,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Eureka源碼解析服務離線狀態(tài)變更

    Eureka源碼解析服務離線狀態(tài)變更

    這篇文章主要為大家介紹了Eureka源碼解析服務離線的狀態(tài)變更示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 新手初學Java面向對象

    新手初學Java面向對象

    這篇文章主要介紹了Java語言面向對象編程思想之類與對象實例詳解,還是十分不錯的,這里給大家分享下,需要的朋友可以參考,希望能幫到你
    2021-07-07
  • java怎么創(chuàng)建目錄(刪除/修改/復制目錄及文件)代碼實例

    java怎么創(chuàng)建目錄(刪除/修改/復制目錄及文件)代碼實例

    這篇文章主要介紹了java怎么創(chuàng)建目錄,還包括刪除/修改/復制目錄及文件,代碼簡單,下面直接看代碼吧
    2013-12-12
  • RocketMQ的兩種消費模式詳解

    RocketMQ的兩種消費模式詳解

    這篇文章主要介紹了RocketMQ的兩種消費模式詳解,RocketMQ主要提供了兩種消費模式,集群消費以及廣播消費,我們只需要在定義消費者的時候通過setMessageModel(MessageModel.XXX),需要的朋友可以參考下
    2023-10-10
  • Java實現計算機程序設計思路

    Java實現計算機程序設計思路

    這篇文章主要為大家介紹了Java實現計算機程序設計思路,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11

最新評論