タイトル
TOPJavaTIPS → This Page

S2Dao(Seasar2) で eclipse のエラー【Java の TIPS、小ネタ、注意点】

前提

Java開発におけるSeasar2S2Daoを使う際のエラー回避方法を紹介します。
このページに記載している内容は2011/03/12に書かれたものです。
掲載している画面や方法が将来的に変更されている場合があります。

以下、それぞれの利用バージョンです。
eclipse3.5.2
seasar22.3.23
S2Dao1.0.51
JREIBM Java 5.0
Oracle10.1.0.2.0
JDBC10.1.0.4.0

謎のエラー

先日、S2Dao を使った開発で、Oracle から単純な SQL でレコードを SELECT する処理で以下のエラーに悩まされた。
とはいえオイラは既に実装から遠ざかった仕事しているので実際に困っていたのは実装メンバーだが。。。
もちろんほっておくわけにもいかず、こちらでも独自に調査。


エラーメッセージは以下の通り
org.eclipse.debug.core.DebugException: 配列のコンポーネント型を検索中に com.sun.jdi.ClassNotLoadedException: 型がロードされていません が発生しました。

org.eclipse.debug.core.DebugException ってことは eclipse 側でエラー出てるの!?


複数レコードが取得される SELECT なので、DAO の戻り値を DTO 配列にしていた。
デバッグ実行していくと S2Dao がプロンプトに出力している SQL には正しい SQL が出力されている。
(出力された SQL を SQL*Plus で実行しても問題なし)

しかし、SQL 実行後の S2DAO が DTO 配列に結果を戻す部分(こちら側の実装部分ではない)で
上記のようなエラーが発生。

・DAO や DTO の実装が間違っているのか?
・実はテーブル名やカラム名が何かの予約語になっているのか?
・S2DAO、JRE、eclipse のバージョンの組み合わせで問題があるのか?
などの原因を考えたがどれもハズレ。

結果

色々と試した結果、原因が判明。
WHERE 句に使っていたカラムが CHAR(4) 型だった。
そこに WHERE XXXXX = '20' のように4桁未満の値を指定しているようだった。
これを WHERE XXXXX = '20  ' のようにスペースで埋めて CHAR のサイズに合わせてやれば問題なく処理が通るようになった。

SQL*Plus などでは暗黙的に変換されるのでレコードが取得されるが、S2Dao ではダメみたい。

単純に「レコードが取得できない」って結果になりそうなのに、
なぜエラーが発生してしまうのか?が微妙に納得いかないところ。
また、なぜ eclipse のエラーなのか?ってこと。

しかし、そこまでは原因が分からなかった。
まぁ今回はそこまで原因究明する必要性がなかったので、ここで調査切り上げ。

更新履歴

2011/03/20 新規作成


TOPJavaTIPS → This Page