Strutsのトラブルシューティングメモ

ここに書いてある原因と解決策はあくまで私がやったミスとその解決策であり、 その現象に対する原因や解決策がすべて書いてあるというわけではありませんのでご注意下さい!

  • フォワード先が空白になる
    ・mapping.findForward()で指定したフォワード名がstruts-config.xmlのActionの定義に書かれていない。
    ・Actionがexecuteメソッドをオーバーライドしていない。 またはメソッド名が間違っているため、正しくオーバーライドできていない。
    ・Actionのexecuteメソッドのシグネチャが異なるため、正しくオーバーライドできていない。
  • JSP文書にアクセスするとJavaScriptエラー
    ・html:formタグのfocus属性に書かれた名前の入力欄(プロパティ)が存在しない。
  • サーブレット action が利用できません
    ・struts-config.xmlの構文エラー、 またはcontrollerタグやpluginタグに記述したクラスがロードできないなどの理由で、 ActionServletの初期化に失敗している。 →サーブレットコンテナのログを見て、エラー原因を解消します。
  • パス /****** に対するリクエストは無効です
    ・html:formのaction属性(など)として指定したパスが、struts-config.xmlに定義されていない。
  • javax.servlet.ServletException: Exception creating bean of class ...: {1}
    ・struts-config.xmlのform-beanに書いたクラスが存在しない。
    ・struts-config.xmlのform-beanに書いたクラスがActionFormを継承していない。
    ・struts-config.xmlのform-beanに書いたクラスがインスタンス化できない (例:抽象クラス、引数のないpublicのコンストラクタがない)
    ・struts-config.xmlのform-beanに記述するDynaActionFormなどのクラス階層が間違っている。 org.apache.struts.action.とorg.apache.struts.validator.に特に注意。
    ・DynaActionFormのつもりで間違ってActionFormと書いている。 ActionFormは抽象クラスなのでインスタンス化できません。
  • java.lang.InstantiationException
    ・上記のエラーと同様、form-beanに書いたクラスが存在しない、インスタンス化できない等の場合に発生します。
  • java.lang.NullPointerException
    org.apache.struts.config.FormBeanConfig.createActionForm(FormBeanConfig.java:286)

    ・上記のエラーと同様、form-beanに書いたクラスが存在しない、インスタンス化できない等の場合に発生します。 (Struts 1.3)
  • html:formの入力内容が自作Form Beanに保存されない
    ・ActionFormやValidatorFormではなく、DynaActionFormを継承してFormBeanを作っている。
  • HTTP Status 500: No action instance for path /***Action could be created
    ・struts-config.xmlでActionクラスに指定したクラスが見つからないか、インスタンス化できない。
  • パス /***Action に対するアクションのインスタンスがありません
    ・struts-config.xmlでActionクラスに指定したクラスが見つからないか、インスタンス化できない。
  • No action instance for path /***Action could be created java.lang.ClassCastException at org.apache.struts.action.RequestProcessor. processActionCreate(RequestProcessor.java:326)
    ・struts-config.xmlでActionクラスに指定したクラスがActionを継承していない。
  • validation.xmlによるバリデーションが効かない
    ・struts-config.xmlのplug-in要素でValidationプラグインの設定を書いていない。
    ・validator-rules.xml、validation.xmlが/WEB-INFに存在しない。
    ・struts-config.xmlのActionの設定でvalidate="false"になっている。
    ・Form BeanがActionFormのサブクラスになっている。 ValidatorFormのサブクラスにしないとバリデーションは動作しません。
    ・Form BeanがDynaActionFormのインスタンスになっている。 DynaValidatorFormのインスタンスにしないとバリデーションは動作しません。
    ・struts-config.xmlのActionの設定で、name属性を書き、attribute属性は省略している場合に、 nameの値と同じ名前のform要素がvalidation.xmlに存在しない。
    ・struts-config.xmlのActionの設定で、name属性とattribute属性の値が異なる場合に、 attributeの値と同じ名前のform要素がvalidation.xmlに存在しない。
    ・ValidatorForm#getValidationKey()をオーバーライドしているとき、 そのメソッドが返す値と同じ名前のform要素がvalidation.xmlに存在しない。
    ・struts.jar、commons-validator.jar、validator-rules.xmlのバージョンが合っていない (ログを注意深く見るとエラーになっているはず。必ず同じstruts配布から展開したものを使いましょう)
    ・message-resourcesの指定内容に相当致命的なエラーがあり、 メッセージリソースの初期化がされていない (paramter属性にカンマや空白が含まれている等。ログには何も出ませんが)
    ・web.xmlに、struts-config.xmlをカンマで区切って複数指定しているとき、 それぞれのstruts-config.xmlに別々の controller、message-resources、plug-in要素のいずれかを書いていて、その内容が違う。
    ⇒controller、message-resources、plug-inは"static"な設定要素で、 別々の内容を二度以上書くと設定が効かなくなります。 完全に同じ内容を2個所以上に書くのはOKみたいです。
  • 入力が正しいはずなのにバリデーションエラーになる
    ・validation.xmlのfield property=のプロパティ名が間違っている(存在しない)
  • メッセージリソースの{1}以降のプレースホルダーが置き換わらず、nullと表示される
    ・validation.xmlのarg position="1"、arg position="2" など(古いStrutsだとarg1、arg2…)の要素のname=属性の値が間違っている。 field要素のdepends=属性に指定したバリデータの種類のいずれかを指定しないといけません。
  • フォームに前回入力した内容が保持されていない
    ・Actionのscopeがrequestになっている(入力内容を保持するにはsessionにするか、何も書かない)
    ・html:textタグなどでvalue属性で初期値を設定している
  • フォームに入力した内容が、Action.execute()に渡されるActionFormに反映されない
    ・1ページに複数のフォーム(html:form)があって、Submit行為をJavaScriptにやらせている場合で、 入力対象のフォームとは違うFormをSubmitしている。
  • メッセージ・リソースを参照したメッセージが表示されない
    ・struts-config.xmlのmessage-resourcesにApplicationPropertiesの設定を書いていない。
    ・struts-config.xmlのmessage-resourcesのクラス階層が間違っている (他アプリケーションのstruts-config.xmlを流用したときなどに大注意)
    ・ApplicationResources.propertiesファイルのうっかり更新漏れ (日本語は直で書けないので他所で編集することが多いが、 最終的な.propertiesファイルの置き場所に反映できていない) Eclipse等のIDEだと「Refresh忘れ」もコワイですね
    ・Webブラウザでページのソースを表示すると、bean:writeタグがそのまま出力されてはおりませんか。 つまり、JSPにtaglibディレクティブでbeanタグライブラリの宣言をしていないのじゃ!
  • javax.servlet.UnavailableException: Parsing error processing resource path
    ・struts-config.xmlのmessage-resourcesの中がリソース・パスとして認識できない。 またはその直前のコメントの開閉タグがおかしく、message-resourcesタグが正しく認識されていない。
  • javax.servlet.ServletException: DispatchMapping[/Actionマッピング] does not define a handler property
    ・DispatchActionを継承したActionクラスに対して、 struts-config.xmlのActionの設定でparameter属性を書いていない。
  • Request[/Actionマッピング] does not contain handler parameter named {パラメータ名}
    ・LookupDispatchActionで、Actionの設定に書いたparameter属性の値と、 JSP文書のフォームのhtml:submitタグのpropertyの値が違う。
    ・LookupDispatchActionで、Submitボタンのラベルとして使うキーに日本語を使っているが、 リクエスト変数のエンコーディングの設定をしていない (Strutsメモのエンコーディングの設定をすると直る)
  • Action.execute()で引数のformがnull
    ・struts-config.xmlでname、attribute属性を設定していない。
  • javax.servlet.ServletException: Cannot retrieve definition for form bean null
    ・JSPの中に、html:formタグがあるとして、そのaction属性で指定されたActionをAとします。 struts-config.xmlのアクションAの定義に、name、attribute属性が設定されていないとこのエラーになります。
  • java.lang.NullPointerException org.apache.commons.beanutils.PropertyUtils.getSimpleProperty(PropertyUtils.java:1162)
    ・よく分かりません。html:formのname属性とtype属性の値に問題があるようです。
  • java.lang.NullPointerException at org.apache.struts.action.DynaActionForm.getDynaProperty(DynaActionForm.java:596)
    ・これもよく分かりません。html:formのname属性とtype属性の値に問題があるようです。
  • java.lang.NullPointerException at org.apache.struts.util.RequestUtils.createActionForm (RequestUtils.java:783)
    ・よく分かりませんが、あるJSPページAから別のJSPページBに遷移するアクションで、 Bが必要とするフォームアクションBeanとは違うクラスのインスタンスを作ろうとしている、 などが考えられます。
    ・作ろうとしているFormBeanがDynaActionFormかDynaValidatorFormで、 表示するフォームに対応するActionにvalidate属性を書いていない。 (これ、なんでか分かりません。validate="false"と書くとときどき直ることがあります)
  • javax.servlet.ServletException: No getter method for property *** of bean org.apache.struts.taglib.html.BEAN
    ・あるJSPにフォームFがあるとします。
    Fにはhtml:textタグなどでpropery="p"という指定のタグがあるとします。
    Fのaction=で指定しているActionをAとします。
    Aにstruts-config.xml上でマップされているフォームアクションBeanをBとします。
    Bのstruts-config.xml上の定義に、プロパティ "p" が存在しないとこのエラーになります。
  • javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection
    ・サーブレットコンテナのログを見たら相当致命的な別のエラーが出ている。それを直すと解決する(かも)
  • javax.servlet.UnavailableException: Initializing application data source org.apache.struts.action.DATA_SOURCE
    ・struts-config.xmlのdata-sourceタグで指定している接続ぷーリングつきのデータソースに接続できない。 DBMSがダウンしていないか、接続情報が正しいかを確認します。
  • java.lang.NullPointerException: 空の属性名です
    at org.apache.jasper.runtime.PageContextImpl.findAttribute(PageContextImpl.java:450)

    ・logic:iterateカスタムタグで、 コレクション要素を(name、name+property、collectionのいずれかの属性で)指定していない。
  • The requested resource (/***) is not available.(HTTP ERROR 404)
    ・struts-config.xmlのActionの定義で、input属性で指定したパスの文書が存在しない。 (先頭にスラッシュがついているかどうか、拡張子がついているかも注意)
  • No input attribute for mapping path /***
    ・Actionのバリデーションに引っかかったが、 struts-config.xmlのActionの定義で、input属性で戻るパスを指定していない。
  • java.lang.IllegalArgumentException: The path of an ForwardConfig cannot be null
    ・これも同じです。Actionのバリデーションに引っかかったが、 struts-config.xmlのActionの定義で、input属性で戻るパスを指定していない。(Struts 1.3)
  • java.lang.NullPointerException org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(PropertyUtils.java:515)
    ・(エラーの内容は場合によって異なるはずです) BeanUtils.populateでNullPointerExceptionが発生するよくある原因は、 Form Beanのスコープをrequestにしているのに、 2画面以上のActionの情報の受け渡しに使おうとしている場合です。 素直にスコープをsessionにします。
  • javax.servlet.ServletException: BeanUtils.populate at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:455)
    ・(エラーの内容は場合によって異なるはずです) 同様に、BeanUtils.populateでServletExceptionが発生するよくある原因は、 Form Beanのスコープがsessionで、Actionの中で次の画面で使うForm Beanを先に作ってsession属性に格納しているとき、 struts-config.xmlのform-beanに書いているのと、実際にsessionに入っているオブジェクトが、 画面の表示に必要十分な同じ名前のプロパティを持っているけれど、違うクラスであるためです。 画面で表示するのに必要なプロパティをsessionに入っているオブジェクトが持っていない場合は、 JSPのレンダリング時にそれとはっきり分かるエラーが表示されるのですぐ分かりますが、 そうでない場合は延々悩みます。特にこのエラーメッセージの真意を読むのは難しかったです。(-_-)
  • nested:iterateループの中でbean:writeを使ってもnestedのBeanのプロパティを印字できない
    ・bean:writeのnested版でnested:writeというタグがあります。 nested:writeの属性はname=ではなくproperty=なので注意。
  • javax.servlet.ServletException: No form found under '****Form' in locale 'ja'
    ・html:formタグでstaticJavascript="true"またはdynamicJavascript="true" と書いているのに、validation.xmlにそのフォームに関するバリデーションが全く定義されていない。
  • org.apache.struts.validator.ValidatorPlugIn:Connection timed out: connect
    ・使っているJakarta Commons Validatorのバージョンが1.2.xで、 validation.xmlに1.3.0用のDTDを書いていると、この不思議なエラーが発生するようです。 Struts同梱のJARとは別に、 http://jakarta.apache.org/commons/validator/ からCommons Validator 1.3.xを入手して、JARファイルを置き換えると解決しました。
  • javax.servlet.jsp.JspException: クラス ***Form のbeanを生成する際の例外
  • ・単純に、そのクラスがインスタンス化できない (パッケージが違う、クラスがpublicではない、抽象クラスである等)。
    ・***FormをアクションフォームBeanとして使う画面(JSP)に一度Webブラウザでアクセスしたとします。 (JSPがコンテナによってコンパイルされる) その後、そのアクションフォームBeanのscopeを(例えば)sessionからrequestに変更して再起動し、 JSPはそのまま(再コンパイルしないまま)のような場合にも起きるようです。
    ・同様に、一度a.b.c.***Formというパッケージで開発して一度Webブラウザでアクセスした後、 d.e.f.***Formというパッケージに変えて配置したのに、JSPを再コンパイルしないままという状況でも、 起きるようです。
  • javax.servlet.ServletException: Bean ***Form のプロパティ *** に対するゲッターメソッドがありません
    ・Form Beanに、コレクションを返すgetterメソッドと、 同じ名前で引数のインデックスの要素を返すメソッドを両方定義していると、 なぜか前者がlogic:iterateタグから参照できなくなってしまうことがあるようです。 (まったく同じプログラムなのに、環境によっては見れることもある…) つまり、
    public List getRecord()
    public MyRecord getRecord(int index)
    という2つのメソッドがある場合、前者はiterateなどのタグに使えません。 これを解決するには?下のようにメソッド名を変えるしかないですね。
    public List getRecordList()
    public MyRecord getRecord(int index)
  • javax.servlet.jsp.JspException: Bean org.apache.struts.taglib.html.BEAN のプロパティ *** に対するゲッターメソッドがありません
    ・まさに書いてある通りの意味。 つまり、JSPのhtml:text property="***" タグなどに書いているプロパティが、 struts-config.xmlのform-propertyで定義されていない。
    ・そうではなくて、最も引っかかりやすく、最も分かりにくい原因は、 ValidatorFormのつもりで間違えてDynaValidatorForm(またはDynaActionForm) を継承してForm Beanクラスを作っている場合です。 「個別のアプリケーション開発者はDyna***Formの派生クラスを定義しないこと」 というコードチェッカーを作ってもいいくらい、開発者本人が延々と悩む落とし穴です。
  • Submitボタンを押しても対応するActionが実行されず、同じページが再表示される。
    ・html:formタグが入れ子になっており、内側のformをSubmitしている。 これは通常のCGIなどでformタグを入れ子にしても同じ現象になります。 JSPカスタムタグだから文書型宣言みたいなものが完備していて、 入れ子の是非まで判定してくれるのではないか? と(XMLと混同して)つい思ってしまいがちですが、それはないので自分で注意するしかない。
  • ActionFormに定義したMap型のプロパティに値が設定されない。 JSPで
    「html:checkbox property="sampleMap['row1']"」と書いても
    「html:checkbox property="sampleMap.row1"」と書いても駄目!

    ・かかったな!(帰れ)
    上のようにStrutsタグのプロパティの書き方をJSTLのEL式の書き方と混同したらドツボにはまるんじゃ。 このページにあるように、 「html:checkbox property="sampleMap(row1)"」が正解です。もういや!こんな生活!!
  • チェックボックスの問題 を解決するためにActionForm.reset(ActionMapping, ServletRequest)をオーバーライドしたが、問題が解決しない。
    ・まーたかかったな!!(帰れ)
    ActionForm.reset(ActionMapping, ServletRequest)ではなく、
    ActionForm.reset(ActionMapping, HttpServletRequest)をオーバーライドしないといけないでやんす。

Server Side Java Index Top

(first uploaded 2003/11/18 last updated 2008/08/02, URANO398)