プログラミング: 2016年10月アーカイブ

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。

恥ずかしいミスだが、ググってみると同じような間違いをして質問している人もいたので、そういう初心者たちの何かの助けになればと思い、ブログに書いときます。
Java のプログラミング中。

PreparedStatement 使って DB を読む部分で

「ORA-00936: 式がありません。」

のエラー。

いや、ちゃんと PreparedStatement オブジェクト作る時、SQL 文渡してるし・・・と思いつつも、なにせ DB アクセスのある Java プログラムを一から作成するのはほぼ初めて。何かパラメータのセットとか間違えてるんかいなあ・・・と思いながら、数十分。あれこれ試してたら・・・

これ、単なる SQL の間違いやん(^^;

SELECT
  hohehoge AS hoge,
FROM
  tbl01,
WHERE
  id = ? AND
  del_time IS NULL

って(^^;

SQL 流用した時、カンマ消すの忘れてるやん(^^;;;
しかも、SELECT の部分と FROM の部分の二箇所も!!(^^;

最近、老眼のせいかこういうミスがちょっと多い気がする。ささっと見ても気付かないんだよな(^^;
わざわざブログに書くほどの話ではないんだけど(ORA-00936 を扱ったブログ記事は星の数ほどあるし)、でも、自戒のために書いとくなり(^^;;;
どうも、長く Perler だったもんで、文字列比較は簡単なものでも正規表現で処理する癖がついてて(Perl の substr関数なんかも使ったことないし)、VB.NET や Java のようなオブジェクト言語を使ってても、文字列系のメソッドには滅相ド弱い俺です。

今日も、文字列 hoge の先頭 1文字目が"A"かどうか?・・・という仕様を、「わかってますよ。substring メソッドを使えばいいんでしょ?わかってますよ、わかってますよ。Perl なら hoge =~ /^A/ で済なのにな~」とか思いながら、

if (hoge.substring(0,1).equals("A")) {
    ...
}

と実装してたら、設計者から「先頭 1文字目が」と仕様書に書いてあるので、

if (hoge.startWith("A")) {
    ...
}

って実装してください・・・と注意されて、そうか、startWith ってメソッドがあるんやあとか思ってるレベルです(笑)

しかも、substring 使うと null のときに落ちちゃうとか。そうなんやあ(^^;

この前に入ってた VB.NET のプロジェクトでは文字列比較があると正規表現ばっか使ってて勉強しなかったんだけど、VB.NET の String クラスにも StartWith メソッドとかあるんやねえ(^^;

「でも、まあ、大文字、小文字の区別なく比較するときは、やっぱ正規表現使わないと厳しいでしょ?」とか思ったら、equals メソッドではなく equalsIgnoreCase なんてメソッドが用意されてんのね(^^;

ああ、覚えること多いなあ(^^;
でも、まあ、オブジェクト言語も、ひとつ覚えたらほとんどの言語でプロパティやメソッドって一緒だから、がんばって Java 覚えよ。家族を養うために(笑)

このアーカイブについて

このページには、2016年10月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2016年6月です。

次のアーカイブはプログラミング: 2016年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら