• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:お世話になります。 )

struts.xmlにおけるエラーハンドリング方法と解決策

このQ&Aのポイント
  • struts.xmlにエラーハンドリングのコードを追加し、Exceptionが発生した場合にはerror.jspに遷移させる方法がある。
  • しかし、この方法ではエラーのスタックトレースをコンソールに表示することができない。
  • エラーのスタックトレースを表示するためには、<interceptors>タグ内に<interceptor>タグを追加する必要がある。

質問者が選んだベストアンサー

  • ベストアンサー
  • Lieserl
  • ベストアンサー率81% (31/38)
回答No.2

名前をdefaultStack以外してみたらどうでしょう? こちらは2.1.6ですが、以下の内容で確認しました。 <package name="example" namespace="/" extends="struts-default"> <interceptors> <interceptor name="handleExceptionLog" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"> <param name="logEnabled">true</param> <param name="logLevel">error</param> <param name="logCategory">test.Error</param> </interceptor> <interceptor-stack name="exampleStack"> <interceptor-ref name="handleExceptionLog" /> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <!-- 中略 --> </interceptor-stack> </interceptors> <default-interceptor-ref name="exampleStack" /> <global-results> <result name="Exception">error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="Exception"/> </global-exception-mappings> </package>

twing
質問者

補足

回答ありがとうございます。 ですが、出来そうで出来ません・・・。 上記ソースで気になるのが、 「<param name="logCategory">test.Error</param>」 というものですが、具体的に何を指定して、どういうコードを記述すればよいでしょうか。 APIを見る限り、必須ではなくデフォルトで、ExceptionMappingInterceptorクラスが 指定されるようですが。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Lieserl
  • ベストアンサー率81% (31/38)
回答No.3

logCategoryは適当につけただけなので、関係ないと思います。 あとは、 http://www.opensymphony.com/xwork/download.action からxworkのソースを取ってきて、ExceptionMappingInterceptorの interceptメソッドあたりにブレークポイントを貼って、 ステップ実行してみるくらいしかないかなぁ。

twing
質問者

お礼

やはり、そうなってしまいますか・・・。 もう少し頑張ってみて、ダメだったら他の案で行こうと思います。 この度は、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Lieserl
  • ベストアンサー率81% (31/38)
回答No.1

実は、defaultStackの先頭にExceptionMappingInterceptorが積まれています。 その為、defaultStackから拡張すると、ExceptionMappingInterceptorが2回呼ばれてしまいます。 そして、defaultStackに積まれている方は、logEnabledの値が初期値のfalseです。 interceptorを辿って、Actionにたどり着き、その先でExceptionが発生しても、 自分で定義したExceptionMappingInterceptorより先に、 defaultStackに積まれているExceptionMappingInterceptorがcatchして処理をしてしまいます。 そのため、logEnabledを指定してもログが出力されません。 defaultStackを拡張するのではなく、defaultStackと同じ内容でinterceptor-stackを定義してみてください。 ちなみにdefaultStackの内容は、struts2-core-バージョン番号.jarの中にあるstruts-default.xmlを見ればわかります。

twing
質問者

補足

回答ありがとうございます。 私のやり方か悪いと思うのですが、いまいちうまく行きません。 現状のstruts.xmlのコードは下記の通りです。 // ---- <package name="my-struts-default" abstract="true"> <!-- 略 --> <interceptors> <!-- 略 --> <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"> <param name="logEnabled">true</param> </interceptor> <!-- 略 --> <interceptor-stack name="defaultStack"> <interceptor-ref name="exception"> <param name="logEnabled">true</param> </interceptor-ref> <!-- 略 --> </interceptor-stack> <!-- 略 --> </interceptors> <default-interceptor-ref name="defaultStack"/> </package> <package name="main" extends="my-struts-default" > <!-- 質問内容のコード同じ --> </package> // ---- 文字数制限で大幅略しているので、わかりづらいですが、 略してある部分は、struts-default.xmlと同じです。 やはり、interceptorが悪さしてますね。 struts初心者には、迷惑な機能です(^^;) あと、書き忘れましたが、strutsのバージョンは2.0.14です。 お手数おかけします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • strutsに関連したxmlのサーブレットマッピング

    失礼致します。 初歩的なことですが質問させてください。 strutsにおけるxmlファイルの記述例は次のようになります。 <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ここで、新しいサーブレット(download)を追加しようと次のように記述を加えました。 <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <servlet-name>download</servlet-name> <servlet-class>Download</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-patte <servlet-name>download</servlet-name> <url-pattern>/download</url-pattern>rn> </servlet-mapping> すると、入り口のファイルに対し、「The requested resource (/プロジェクト名/ファイル名.jsp) is not available.」と警告されました。 strutsではサーブレットの追加は出来ないのでしょうか?ご指摘お願いします。

    • ベストアンサー
    • Java
  • strutsで、JSP→アクションクラス→JSPの遷移ができない。

    Strutsを勉強中の者です。 初心者的な質問で大変恐縮ですが、どこを調べても原因が分からなかったので、最終手段としてこちらに質問させて頂く事にしました。 どなたかご存知の方がいらっしゃいましたらご教授頂けないでしょうか。 ・概要  strutsで、JSP→クラスの実行→JSPの遷移ができない。 ・環境  WindowsXP  Eclipse3.3  Tomcat5.5  GEF3.3  struts-1.3.8  JDK1.5 ・詳細  「Eclipseパーフェクトマニュアル ベストセレクション」  という本をもとに勉強しています。  ここのStrutsの例題で  (1).簡易家計簿 <メニュー画面>(index.jsp)を表示   (2).同画面のリンク(ShoppingInitEntry.do)をクリック   (3).リンク(ShoppingInitEntry.do)に関連づけられているクラス(ShoppingInitEntryAction)の実行   (4).データ入力画面(ShoppingUpdate.jsp)への遷移  という事をやっています。  実際に設定して、動かして見ましたが、  Eclipseでデバッグを貼っていると(3)まで動作しているのが分かるのですが、(4)の画面まで遷移しません。  具体的には、ShoppingInitEntry.doのリンクが  ブラウザのアドレスバーに表示され、画面が真っ白の状態になります。  (データ入力画面は表示されない)  尚、直接(4)の画面(ShoppingUpdate.jsp)を開くと、  データ入力画面がエラーも無く表示されます。 ---- struts-config.xmlの設定が悪いのかと思ったのですが、 問題は無さそうに思います。(必要と思われる部分を抜粋) <struts-config> <global-forwards> <forward name="ShoppingInitEntry" path="/ShoppingInitEntry.do"/> </global-forwards> <action-mappings> <action path="/ShoppingInitEntry" type="MoneyBooks.ShoppingInitEntryAction" input="/index.jsp"> <forward name="success" path="/ShoppingUpdate.jsp"/> </action> </action-mappings> </struts-config> ---- (3)ShoppingInitEntryActionのソースは、下記の通りです。 public class ShoppingInitEntryAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return super.execute(mapping, form, request, response); } } 上記のreturn super.execute( ~の部分では nullを返しているようです。 Eclipseのコンソールにメッセージは表示されません。 A.原因は、struts-config.xmlでしょうか? それともクラスがnullを返している為に画面遷移しないのでしょうか?    そもそもsuper.executeのソースをjadのデコンパイルで追ったのですが、返り値としてNullしか返していない状態です。 B.また、馬鹿な質問ですが、そもそもjavaではnullを返り値で返すとオール×だと思っているのですが、この考え方は正しいでしょうか?  大変お恥ずかしい限りですが、ご存知の方がいらっしゃいましたら教えて頂きたく宜しくお願い致します。

    • ベストアンサー
    • Java
  • Strutsのtaglibについて

    Strutsを最近学習し始めた超初心者ですが... taglibを使えるようにするweb.xmlの設定なんですが。 なぜかエラーが出てしまいます。 環境はeclipse3.1.1 Struts1.2.9 apache-tomcat-5.5.25です。 web.xmlの記述は以下の通りです。 <?xml version="1.0" encoding="ISO-8859-1"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <display-name> test01</display-name> <filter> <filter-name>CharacterEncoding</filter-name> <filter-class>filters.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <taglib> <taglib-uri>/tags/struts-html</taglib-uri> <taglib-location>/WEB-INF/lib/struts-html.tld</taglib-location> </taglib> </web-app> <taglib>のところにエラーの×が出てしまうのですが。 何か間違ってますか?? とても困ってますので是非、わかる人お願いします!!

    • ベストアンサー
    • Java
  • 教えてください:strutsのhtml:formタグがjspに展開された状態の、actionの値について

    java初心者です。 どなたか教えていただけませんでしょうか? JAVAのstrutsを使用してソフトを作成しています。 JSPに記載した「<html:form action="/authentication" focus="id"> 」 との記述が、WEB(IE)に展開されたソースを見ると、「<form name="AuthenticationForm" method="post" action="/strutsTest/authentication">」 に変換されています。 action="/authentication"と記述しているにもかかわらず、 action="/strutsTest/authentication"と展開されているのですが /strutsTestが自動的に付与されているのは、なぜなのでしょうか? なにか設定するところがあるのでしょうか? ※struts-config.xmlに指定したpathと一致しない為、404NotFoundになるので自動設定しないように変更したいのです。 ちなみに環境は struts-1.3.10 Apache Tomcat 6.0.14 Server EclipsVersion: 3.4.2 pakage名:struts プロジェクト名:strutsTest struts-config.xmlの設定   <form-beans> <form-bean name="AuthenticationForm" type="struts.AuthenticationForm"/> </form-beans> <global-exceptions> </global-exceptions> <global-forwards> <forward name="fail" path="/login.jsp"/> </global-forwards> <action-mappings> <action path="/authentication" name="AuthenticationForm" type="struts.AuthenticationAction" scope="session"> <forward name="success" path="/welcome.jsp"/> <forward name="fail" path="/login.jsp"/> </action> </action-mappings> login.jsp <%@ page contentType="text/html; charset=Windows-31J" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J"/> <title>ログイン画面</title> </head> <body> <html:errors/> ID・パスワードを入力してください。 <html:form action="/authentication" focus="id"> <html:text property="id" size="16"/> <br> <html:password property="pas" size="16" redisplay="false" /> <br> <html:submit property="submit" value="送信"/> <html:reset value="リセット"/> </html:form> </body> </html:html> 動作順は、login.jsp => AuthenticationAction.class => welcome.jsp です。 よろしくお願いします。

  • log4jでスタックトレースを出力できるのでしょうか?

    log4jでスタックトレースを出力できるのでしょうか? }catch (Exception e){ logger.error(e); } で行うとスタックトレースの1行目しか出力されません。 e.printStackTrace(); のようにすべて出力するにはどうすればよいのでしょうか?

    • ベストアンサー
    • Java
  • struts2のchainで値の受け渡しができない

    Java 6 Update 22 struts2.2.1 です。 次のとおり各クラスとstruts.xmlを作成しました。 Top_guestLoginアクションを実行してHelloUserクラスに遷移することはできましたが、変数isGuestModeの値が受け渡しされません。 public class Top implements SessionAware { private boolean isGuestMode = false; public boolean getIsGestMode() { return isGuestMode; } public String guestLogin() throws Exception { isGuestMode = true; return "success"; } } public class HelloUser { private boolean isGuestMode; public boolean getIsGuestMode() { return isGuestMode; } public void setIsGestMode(boolean b){ isGuestMode = b; } public String execute() throws Exception { return "success" ; } } struts.xml <package name="example" extends="struts-default"> <action name="HelloUser" class="example.HelloUser"> <result>/example/HelloUser.jsp</result> </action> <action name="Top_guestLogin" method="guestLogin" class="example.Top" > <result name="success" type="chain" >HelloUser</result> </action> </package> 何方かアドバイスをお願い致します。

    • ベストアンサー
    • Java
  • WebLogic6.0 でのJSPプリコンパイルについて

    WebLogic6.0でJSPのプリコンパイルを行いたいのですが、 Javaコマンドからのコンパイルはできるのに、 weblogic.xml で <jsp-descriptor> <jsp-param> <param-name>precompile</param-name> <param-value>true</param-value> </jsp-param> </jsp-descriptor> と指定しても web.xml で <context-param> <param-name>weblogic.jsp.precompile</param-name> <param-value>true</param-value> </context-param> と指定しても、 エラーがでるだけ、または何も起こらずクラスファイルが生成されない、 となってしまいます。 WebLogic6.0のspecificationにはプリコンパイルの方法がのっているのに 付属のマニュアルにはのっていないので、これはいまだ 解決できないバグということなのでしょうか。 どなたかご存じの方がいましたら教えてください。

    • ベストアンサー
    • Java
  • Oracleのエラースタックトレース設定について

    お世話になっております。 件名のエラースタック設定について質問があります。 OSはwindows。 oracleのバージョンは11gです。 現在、複数のeventを設定しようと考えておりまして、以下のようなSQLを実行しました。 (仮として1111と2222のエラースタックを設定すると想定します。) ・alter system set event = "1111 trace name errorstack level 3:2222 trace name errorstack level 3" scope=spfile; 上記のSQLを実行後、下記のSQLにて設定を確認しました。 ・select name,value,display_value,isspecified,ordinal from v$spparameter where name='event'; 出力結果のvalueおよびdisplay_valueに「1111 trace name errorstack level 3:2222 trace name errorstack level 3」と表示されているのですが、これは正しく1111と2222のエラースタックが設定されたということで宜しいのでしょうか? 宜しくお願いします。

  • Java struts Formを分ける

    Java Struts1.3.10 1jspにつき1Formとし、A.jspからB.jspへ遷移させようと思っています。 しかしA.jspは正常に表示されるのですが、遷移後エラーが発生します。 Bean AForm のプロパティ AList に対するゲッターメソッドがありません 遷移後に見てほしいのはBFormなのですが、AFormを見てしまっています。 どのようにすればBFormを参照することができますでしょうか? struts-config.xml <action attribute="AForm" input="/pages/A.jsp" name="AForm" path="/Result" type="jp.co.elephan.rental.action.Aaction" scope="session" validate="true" parameter="insert"> <forward name="Result" path="/pages/B.jsp" /> <forward name="Return" path="/pages/A.jsp" /> </action> <!-- --> <action attribute="BForm" input="/pages/B.jsp" name="BForm" path="/Return" type="jp.co.elephan.rental.action.Baction" scope="session" validate="true" parameter="yes,no"> <forward name="Result" path="/pages/A.jsp" /> <forward name="Return" path="/pages/B.jsp" /> </action> 以上です。

    • ベストアンサー
    • Java
  • strutsで、任意の画面からの任意のURLを受け付けた時の処理がしたい。

    strutsを勉強中の者です。 strutsで、  (1)a.jsp→(2)b.do→(3)b.class→(4)c.jsp という画面遷移はできるようになったのですが、(現在b.doとb.classは同じ名前にしています。) 任意の画面からの呼び出しで、  (1)*.jsp→(2)*.do→(3)b.class→(4)c.jsp とし、(2)で入力された任意のURLを(3)で解析し、そのURLによって(3)内部での処理を分岐したいのです。 ちなみに、struts-config.xmlの定義で、 <action-mappings> <action className="test.ShowMain" path="/ShowMain" input="/jsp/html/*.jsp"> <forward name="success" path="/jsp/html/main.jsp"/> </action> </action-mappings> と、*を使って編集しようとしても、 画面に、HTTPステータス 500 が表示され、 コンソールには、 ---- 致命的: End event threw exception java.lang.NoSuchMethodException: No such accessible method: addForwardConfig() on object: test.ShowMain 2008/08/17 10:43:13 org.apache.struts.action.ActionServlet handleConfigException 致命的: パス /WEB-INF/struts-config.xml に対するリソース読み込みエラー java.lang.NoSuchMethodException: No such accessible method: addForwardConfig() on object: test.ShowMain 情報: サーブレット action を利用不可能にマークします 2008/08/17 10:43:13 org.apache.catalina.core.StandardContext loadOnStartup 致命的: サーブレット /test がload()例外を投げました javax.servlet.UnavailableException: パス /WEB-INF/struts-config.xml に対するリソース読み込みエラー ---- と表示されてしまいます。 環境は、  WindowsXP  Eclipse3.3  Tomcat5.5  GEF3.3  struts-1.3.8  JDK1.5  「Eclipseパーフェクトマニュアル ベストセレクション」  という本をもとに勉強しています。 a.こうした任意のページを受信する、という方法はStrutsで可能なのでしょうか? b.可能である場合、どのような方法を取れば良いでしょうか? どなたかご存知の方がいらっしゃいましたら教えて下さい。 宜しくお願い致します。

    • ベストアンサー
    • Java