アプリ版:「スタンプのみでお礼する」機能のリリースについて

struts2でStruts.xmlに例外が発生した場合はError.JSPに遷移するように指定しました。
Actionクラス上で発生した例外はError.JSPに遷移するようになりましたが
interceptorで発生した例外はTomcatのエラー画面に遷移してしまいます。

これは仕様なのでしょうか?

A 回答 (1件)

可能性1.そのinterceptorがExceptionMappingInterceptorよりも前に来ているんじゃないかな。

細かいバージョンがわかんないのでstruts2.1系(strutsには1.3系と2.0系と2.1系がある)の最新リリース版である2.2.3で説明する。struts-core-2.2.3.jarの中にあるstruts-default.xmlを見てみると

 <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>

という行があるのが分かるだろう。
 こやつが例外をキャッチして向き先(result)を切り替えている。java.lang.Exceptionならerrorというresultに、com.examples.dfogkjapreg1657.RequestExceptionならrequest-errorというresultに、例外の種類と、強制的に上書きするresultをリストする。その設定はあなたが作ったstruts.xmlのglobal-exception-mappingsタグで行っている事と思う。で、resultがglobal-resultsの中や各アクションのresultsに引っかかると該当のページ(JSPなど)にフォワードされるわけだ。

 同じくstruts-default.xmlにあるinterceptor-stackを見ると大体こいつが「先頭の」interceptorである事が分かると思う。これは、interceptor-stackが上から順に呼ばれるからだ。
 なので、あなたが作っているpackageが参照するinterceptor-stackの先頭にこのexceptionを配置してあげないと、(interceptor階層的に)exceptionよりも親にある別のinterceptorで起こった例外はキャッチできないのである。

可能性2.ただ単にstrtus.xmlのglobal-error-mappingで該当の例外を指定していないのではなかろうか。global-error-mappingは、可能であればjava.lang.Exceptionに対するマッピングを必ず指定してあげるのが良い。そうするとRuntimeExceptionもキャッチできるようになる(まぁStruts2のActionは基本的にthrows java.lang.Exceptionなのでjava.lang.Exceptionに対するキャッチはする方が良いだろう)。
    • good
    • 0

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