Struts2などでJavaアプリを開発していると、OGNL式によるプロパティへの簡単なアクセスを日常的に使用しますが、変数名がとある名前の場合にのみアクセス出来ないという状況が発生します。
今回はその不具合についてのメモ書きになります。
まず前提として、OGNL式で変数にアクセスする際
<s:property value="iValue"/>
のようにJSPコードを記述すると、バリュースタック内で
getIValue();
した結果の値が取得出来ます。
当然ですが”getIValue”というgetterメソッドが存在していなければ値の取得は出来ません。
そして、バリュースタックに格納する変数の宣言+アクセサ(getter/setter)メソッドの実装ですが、大体アクションクラス内にインスタンス変数としてprivateで宣言、初期化まで手打ちで入力し、アクセサ自体はeclipseの自動生成で作成する場合が多いと思います。
eclipseの自動生成というのがミソなんですが、変数名の2文字目を大文字にするとアクセス出来ないアクセサが出来ます。
例えば、
private int iValue;
という2文字目が大文字の名前の変数を宣言し、eclipseによるアクセサ自動生成を行うと
のように
public int getiValue() { return iValue; } public void setiValue(int iValue) { this.iValue = iValue; }
として生成されますので、OGNL式が呼ぶ”getIValue”とは違う名前になり、アクセス出来ません。
私のようにeclipseの自動生成を信用しきっていると原因が分かるまで結構はまります。
灯台下暗し的な、まさかeclipseが、といった感じで。
ちゃんとアクセサを実装しているのに動かない!といった方の参考になれば幸いです。