Development Java

JPAエンティティとJava 8の日時APIでUnsupportedOperationExceptionが発生するときの対処

投稿日:

概要

データベースから取得したオブジェクトに対して、Java 8のDate and Time APIを使おうとしたら UnsupportedOperationException が発生して、原因がわかるまで時間がかかったのでメモしておきます。

LocalDateの場合

カラムの定義はこちら

これを

LocalDateに変換しようとすると以下のエラーが発生します

LocalDateTimeへの変換でも発生

LocalDateだけでなく、LocalTimeへの変換でも発生します。

こんなフィールドを

でLocalDateTimeに変換しようとすると以下のエラーが発生します。

ユニットテストでは検出できず

この問題は、サーバー上で実行するまで問題に気づきませんでした。

原因は、ユニットテスト時は java.util.Date 型のデータでテストしたが、実際のデータベースからデータを取得すると、 java.sql.Date java.sql.Time型が返ってくるためでした。

Java 8 Date and Time APIの変換は、 java.sql.Datejava.sql.Timeからは変換できず、 java.util.Date にキャストしてからでないと UnsupportedOperationExceptionが発生します。

java.sql.Datejava.sql.Timeも、 java.util.Dateのサブクラスなので、コードだけ見ても問題には気づきません。

対処策

原因がわかってしまえば対処策は簡単でした。

以下のユーティリティメソッドを使って、java.util.Dateに変換するようにしたらエラーは発生しなくなりました。

またテストクラスでも、あえて java.sql.Datejava.sql.Time型のデータを作ってテストをするようにしました。

原因がわかってしまうとあっけないですが、結構ハマってしまいました…

-Development, Java

Copyright© 技術系のメモ , 2019 All Rights Reserved.