M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

SVNKitのDate型をPostgreSQLドライバに食べさせると毒死

引続きMyBatis関連でハマったはなしです。SVNリポジトリや作業コピーをJavaコードから操作するためのライブラリSVNKitにまつわるはなしです。まずは結論。

結論

SVNKitのAPIが返すjava.util.Date型オブジェクトをPostgreSQLJDBCドライバに食べさせてはいけない。少なくともドライバ側としては想定外の実装となっているらしくエラーが発生する。

背景

直近個人的に手がけているアプリケーションで、SVNKitを通じて取得したSVNリポジトリのコミット情報をDBに登録するロジックがありました。svn logコマンドに相当するSVNLogClient#doLog(...)メソッドISVNLogEntryHandlerインターフェースを実装したインスタンスを渡して、個々のコミット情報を処理します。個々のコミットを処理するロジックはISVNLogEntryHandler#handleLogEntry(...)メソッドにコードします。

問題はこのhandleLogEntry(...)の引数SVNLogEntrygetDate()メソッドが返すDate型オブジェクトです。型としてはjava.util.Dateです。それはまちがいありません。しかし実装としてはSVNKit開発者が拡張した独自のオブジェクトorg.tmatesoft.svn.core.internal.util.SVNDateです。これをMyBatisのマッパーを通じてSQLにバインドしようとすると例外がスローされます。事が起きてからDate型がfinalでないということを思い出しました。

対策としてはDate#getTime()long値を取り出したあと、新しいJava標準ライブラリ純正(というのはちょっと正しくないのですが)のDateインスタンスに詰め直すというもの。事象の厳密な原因は不明・・・というか調べるのが面倒なので放置です。