重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になります。

struts.xmlにおいて、下記コードを入れて、
Exceptionが発生した際に、error.jspに飛ばしています。

// ----
<global-results>
<result name="Exception">error.jsp</result>
</global-results>

<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="Exception"/>
</global-exception-mappings>
// ----


しかし、コンソールにエラーのスタックトレースが表示できません。
勿論、コメントにするとスタックトレースが出ます。

下記URLを参考に
http://d.hatena.ne.jp/techmedia-think/20080609/1 …

// ----
<interceptors>
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor">
<param name="logEnabled">true</param>
</interceptor>
</interceptors>
// ----

を付け加えましたが、スタックトレースが出ませんでした。

何が原因で、どうすれば解決できるでしょうか。
宜しくお願い致します。

A 回答 (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>

この回答への補足

回答ありがとうございます。
ですが、出来そうで出来ません・・・。

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

補足日時:2010/02/04 16:28
    • good
    • 0

logCategoryは適当につけただけなので、関係ないと思います。



あとは、
http://www.opensymphony.com/xwork/download.action
からxworkのソースを取ってきて、ExceptionMappingInterceptorの
interceptメソッドあたりにブレークポイントを貼って、
ステップ実行してみるくらいしかないかなぁ。
    • good
    • 0
この回答へのお礼

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

この度は、ありがとうございました。

お礼日時:2010/02/05 17:17

実は、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です。
お手数おかけします。

補足日時:2010/02/04 10:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!