Seasarでは命名規約に則ったクラス名のクラスのインスタンスを、同名のフィールドにインジェクションしてくれる機能があります。
public class SampleService {
/** DIコンテナがインジェクションしてくれるフィールド */
public HogeLogic hogeLogic;
public void exec() {
// メソッド中はインスタンスフィールドにインジェクションされる前提でコードを書く
this.hogeLogic.hoge();
}
}
これは命名規約を理解して使っている分には便利なのですが、Eclipseのリファクタリング機能などで
クラス名をリネームすると突如動かなくなることがあるので注意が必要です。
上記例で、HogeLogicをPiyoLogicにリネームするとしましょう。HogeLogicのクラス名を選択して、Refactor → rename を選択します。
すると以下のようなバルーンが表示される(以下はEclipse3.4のスクリーンショット。確か3.2以前ではリネームは必ずダイアログでの入力だったはず)
ので新しい名前―ここではPiyoLogicとしましょう―を入力します。
すると、Eclipseのリファクタリング機能でクラス名をリネームすると、参照している箇所を網羅的に探してリネームしてくれるため、
プロジェクトの全ソース中でHogeServiceがPiyoServiceに変わります。
この際、クラス名は変更されますが、同名のフィールド名まではリネームしてはくれません。
そのため、SampleServiceでのフィールド宣言は以下のようになります。
/** DIコンテナがインジェクションしてくれるフィールド */
public PiyoLogic hogeLogic;
フィールド名が元のままですね。これにより、命名規約違反が生じてうまくインジェクションされなくなります。
コンパイルエラーは起きませんが、実行時にインジェクションを期待したフィールドがnull値となり
NullPointerExceptionを発生させることになります。
デフォルトのリネーム操作だとこのような問題が起きるのですが、Eclipseにはフィールド名を含めたリネームがサポートされています。
リネームの際に▼をクリックし、"Open Rename Dialog"とします。(キーボードショートカットのAlt+Shift+Rも活用しましょう)
"Update similarly named variables and methods"にチェックを入れます。
同名の変数とメソッド(getter,setterなど)を更新する、という意味合いですね。
そうすると、以下のように変数名も同時にリネームしてくれます。
public class SampleService {
/** DIコンテナがインジェクションしてくれるフィールド */
public PiyoLogic piyoLogic;
public void exec() {
// メソッド中はインスタンスフィールドにインジェクションされる前提でコードを書く
this.piyoLogic.hoge();
}
}
Seaserなどを利用している場合は、クラス名のリネームの際にはこの点に気を付けて作業しましょう。
投稿日時 : 2008年10月22日 9:45