uebu: 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は抽象クラスなのでインスタンス化できません。
  • 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のインスタンスにしないとバリデーションは動作しません。
    ・Actionが指定するForm BeanがDynaValidatorFormではなく自作Beanで、 その中にvalidate()メソッドが実装されていない。
    ・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の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 ファイルの置き場所に反映できていない)
    ・JSPにtaglibディレクティブでbeanタグライブラリの宣言をしていない (ページのソースを表示すると、bean:writeタグがそのまま出力されているケース)
  • 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.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ファイルを置き換えると解決しました。