- ベストアンサー
struts.xmlにおけるエラーハンドリング方法と解決策
- struts.xmlにエラーハンドリングのコードを追加し、Exceptionが発生した場合にはerror.jspに遷移させる方法がある。
- しかし、この方法ではエラーのスタックトレースをコンソールに表示することができない。
- エラーのスタックトレースを表示するためには、<interceptors>タグ内に<interceptor>タグを追加する必要がある。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
名前を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>
その他の回答 (2)
- Lieserl
- ベストアンサー率81% (31/38)
logCategoryは適当につけただけなので、関係ないと思います。 あとは、 http://www.opensymphony.com/xwork/download.action からxworkのソースを取ってきて、ExceptionMappingInterceptorの interceptメソッドあたりにブレークポイントを貼って、 ステップ実行してみるくらいしかないかなぁ。
お礼
やはり、そうなってしまいますか・・・。 もう少し頑張ってみて、ダメだったら他の案で行こうと思います。 この度は、ありがとうございました。
- Lieserl
- ベストアンサー率81% (31/38)
実は、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を見ればわかります。
補足
回答ありがとうございます。 私のやり方か悪いと思うのですが、いまいちうまく行きません。 現状の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です。 お手数おかけします。
補足
回答ありがとうございます。 ですが、出来そうで出来ません・・・。 上記ソースで気になるのが、 「<param name="logCategory">test.Error</param>」 というものですが、具体的に何を指定して、どういうコードを記述すればよいでしょうか。 APIを見る限り、必須ではなくデフォルトで、ExceptionMappingInterceptorクラスが 指定されるようですが。