LocalDate、LocalTime、LocalDateTimeは、Java 8が提供する時刻および日付APIであり、主にJava 8の時間と日付の処理操作を最適化するために使用されます。ただし、Spring BootまたはSpring Cloud Feignを使用すると、リクエストパラメーターを使用したり、結果を返す場合にさまざまな問題が発生することがよくあります。この記事では、この状況で発生する問題とそれらの解決方法について説明します。
問題現象
最初に症状を見てみましょう。たとえば、次の例:
@springBootApplicationPublic class Application {public static void main(string [] args){springApplication.run(application.class、args); } @RestControllerクラスHelloController {@PostMapping( "/user")public userdto user(@requestbody userdto userdto)スロー{return userdto; }} @data @noargsconstructor @allargsconstructor static class userdto {private string username;プライベートローカルデートの誕生日。 }}上記のコードは、LocalDateタイプのデータを含むユーザー情報を送信するインターフェイスを提供するSimple Spring Boot Webアプリケーションを構築します。この時点で、このインターフェイスを呼び出すためにfeignを使用する場合、次のエラーが表示されます。
2018-03-13 09:22:58,445 WARN [HTTP-NIO-9988-EXEC-3] org.springframework.web.servlet.mvc.support.defaulthandlerexceptionResolver- httpメッセージを読むことができなかった: org.springframework.http.converter.httpmessagenotreadableexception:json parseエラー:Java.time.localdateのインスタンスを構築できません:適切なコンストラクターが見つかりません。ネストされた例外はcom.fasterxml.jackson.databind.jsonmappingexception:java.time.localdateのインスタンスを構築できません。行:1、列:63](参照チェーンを介して: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 。SpringMVCに精通した子供用の靴は、すぐにエラーを見つけ、ローカルデートの脱必要なものに関連することができます。ただし、このエラーメッセージjava.util.ArrayList[0]->com.didispace.UserDto["birthday"]に混乱する多くの読者がいます。私たちが名前を付けて提出したUserDto["birthday"]は、ローカルデートオブジェクトです。 ArrayList Listオブジェクトとは何が必要ですか?
郵便配達員やその他の情報を通じて手動でリクエストを送信して、サーバーが返されるものを確認することもできますか?たとえば、次の画像に従ってリクエストを行うことができます。
上記の図から、私が上記の混乱を理解することができます。実際、デフォルトでは、Spring MVCはLocalDateをArrayタイプにシリアル化し、装備が呼び出された場合でも、ArrayListに従って処理するため、当然のことながらローカルデートオブジェクトに偏りません。
解決
上記の問題を解決するために、ジャクソンはこれに完全なシリアル化ソリューションのセットも提供するため、非常に簡単です。次のように、POM.xmlでJackson-Datatype-JSR310依存関係を導入するだけです。
<Dependency> groupId> com.fasterxml.jackson.datatype </groupId> <artifactid> jackson-datatype-jsr310 </artifactid> </dependency>
注:Spring Bootの親が設定されている場合、特定のバージョンを指定する必要はなく、特定のバージョンを指定することをお勧めしません。
このモジュールにおけるJava 8の時間式APIシリアル化の実装をカプセル化し、その特定の実装はこのクラスにあります:com.fasterxml.jackson.datatype.jsr310.javatimemodule(注:以前のバージョンはこのクラスに夢中です "com.fasterxml.jackson.datatepe.jsr310.jsr310.jsr310.jsr310.jsr310.jsr310.jsr310.jsr310.jsr310.jsr310.依存関係では、このシリアル化モジュールを上記のアプリケーションメインクラスに追加するだけで、同時に標準のISO 8601形式を有効にする必要があります。
@BeanPublic ObjectMapper serializingObjectMapper(){objectMapper objectMapper = new objectMapper(); ObjectMapper.disable(serializationfeature.write_dates_as_timestamps); ObjectMapper.registerModule(new JavatimeModule()); ObjectMapperを返します;}この時点で、今すぐインターフェイスにアクセスしているとき、それはアレイタイプではなくなり、Feignクライアントを呼び出すと上記のエラーが発生しなくなります。
コードの例
この記事の関連例については、次のリポジトリで第3-1-7章のディレクトリを表示できます。
github:https://github.com/dyc87112/springboot-learning
Gitee:https://gitee.com/diidispace/springboot-rearning
要約します
上記は、Spring Boot and PeignでJava 8時間および日付API(Localdateなど)を使用するシリアル化の問題です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!