SVNKitのDate型をPostgreSQLドライバに食べさせると毒死
引続きMyBatis関連でハマったはなしです。SVNリポジトリや作業コピーをJavaコードから操作するためのライブラリSVNKitにまつわるはなしです。まずは結論。
結論
SVNKitのAPIが返すjava.util.Date
型オブジェクトをPostgreSQLのJDBCドライバに食べさせてはいけない。少なくともドライバ側としては想定外の実装となっているらしくエラーが発生する。
背景
直近個人的に手がけているアプリケーションで、SVNKitを通じて取得したSVNリポジトリのコミット情報をDBに登録するロジックがありました。svn log
コマンドに相当するSVNLogClient#doLog(...)
メソッドにISVNLogEntryHandler
インターフェースを実装したインスタンスを渡して、個々のコミット情報を処理します。個々のコミットを処理するロジックはISVNLogEntryHandler#handleLogEntry(...)
メソッドにコードします。
問題はこのhandleLogEntry(...)
の引数SVNLogEntry
のgetDate()
メソッドが返すDate
型オブジェクトです。型としてはjava.util.Date
です。それはまちがいありません。しかし実装としてはSVNKit開発者が拡張した独自のオブジェクトorg.tmatesoft.svn.core.internal.util.SVNDate
です。これをMyBatisのマッパーを通じてSQLにバインドしようとすると例外がスローされます。事が起きてからDate
型がfinal
でないということを思い出しました。
対策としてはDate#getTime()
でlong
値を取り出したあと、新しいJava標準ライブラリ純正(というのはちょっと正しくないのですが)のDate
インスタンスに詰め直すというもの。事象の厳密な原因は不明・・・というか調べるのが面倒なので放置です。