Struts1 の保守案件で JSP をぽちぽち触っている時に、
HTTPステータス 500 - javax.servlet.ServletException: javax.servlet.jsp.JspException:Cannot find bean under name sex_list
というエラーが出たのでしばし悩む。
「sex_list」という名前の「bean」を見つけられない?
「bean」の中に「sex_list」を見つけられない?
英語苦手なのと Java/Struts 初心者なのでどう訳すのが正解なのかわからないが、sex_list プロパティが見つからないと言っているのは確かなようだ・・・
説明には、
The server encountered an internal error that prevented it from fulfilling this request.
とあるが、リクエストが内部エラーを起こしたぜってだけの説明で、結局「Cannot find bean under name sex_list」が全てだな・・・(^^;
ちなみに JSP の記述は
<html:select property="sex"><html:option collection="sex_list" property="label" labelProperty="value"/></html:select>
で、hogeForm というアクション・フォーム Bean の記述は、
private Vector<LabelValueBean> sex_list = new Vector<LabelValueBean>();public Vector<LabelValueBean> getSex_list() {return sex_list;}public void setSex_list(Vector<LabelValueBean> sex_list) {this.sex_list = sex_list;}
こんな感じで問題なさそう。
あ・・・hogeForm っていうアクション・フォーム Bean の名前を指定してないからか。
このシステムでは、baseForm クラスが extends ActionForm という具合に ActionForm クラスを継承しており、hogeForm クラスはこの baseForm クラスをスーパークラスにしている。
なので、name 属性で hogeForm を指定していないから、大元の baseForm クラスに getSex_list メソッドを参照にいっちゃうのか???で、sex_list プロパティは実際には hogeForm にしか存在していないからエラーになると。
<html:form>タグか、<html:select>タグに name 属性で hogeForm を指定すれば良いようだが、他のソースを漁ってみると、<bean:define>タグで指定していたので、同じように、
<bean:define id="sex_list" name="hogeForm" property="sex_list" scope="request"/>
という記述を追加してバッチリOK。
恥ずかしいミスだが、ググってみると同じような間違いをして質問している人もいたので、そういう初心者たちの何かの助けになればと思い、ブログに書いときます。
コメントする