10

エラーページが2つあります。1つはSpecificExceptionA用で、もう1つはThrowable用です。

<error-page>
  <exception-type>org.SpecificExceptionA</exception-type>
  <location>/WEB-INF/views/error/timedout.jsp</location>
</error-page>

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/WEB-INF/views/error/error.jsp</location>
</error-page>

これらの両方をweb.xmlで定義している場合、すべてが/error/error.jspに移動します。

特定の例外を定義しただけの場合は、適切なページに移動します。ただし、その他のエラーはTomcatのデフォルトになります(404を除く)

特定の例外ハンドラーを指定するためのより良い方法はありますか?Spring3.0を使用しています。

4

2 に答える 2

11

これは Tomcat に固有のものではありません。これはサーブレット API に固有のものです。エラーページの決定方法は、サーブレット API 仕様 2.5の 9.9.2 章で指定されています。関連性の抜粋を次に示します。

SRV.9.9.2 エラーページ

クラス階層を使用した一致をerror-page含む宣言がなく、スローされた例外がそのクラスまたはそのサブクラスである場合、コンテナーは、メソッドで定義されているように、ラップされた例外を抽出します。2 番目のパスはエラー ページ宣言に対して行われ、エラー ページ宣言との照合が再度試みられますが、代わりにラップされた例外が使用されます。exception-typeServletExceptionServletException.getRootCause

したがって、あなたSpecificExceptionAは a でラップされている可能性が高いServletExceptionため、java.lang.Throwable最初のパスで最も近い一致です。このエントリを削除すると、ラップされた例外で 2 番目のパスが作成されるSpecificExceptionAため、一致が得られます。

error-code一般的な HTTP 500 エラー ページを定義する正しい方法は、次の代わりにマップすることですexception-type

<error-page>
    <exception-type>org.SpecificExceptionA</exception-type>
    <location>/WEB-INF/views/error/timedout.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/views/error/error.jsp</location>
</error-page>

何らかの理由でこれがオプションでない場合、これを回避する方法の 1 つは、ofFilterをリッスンし、基本的に次のことを行う を作成することです。url-pattern/*

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    try {
        chain.doFilter(request, response);
    } catch (ServletException e) {
        Throwable rootCause = e.getRootCause();
        if (rootCause instanceof SpecificExceptionA) {
            throw (SpecificExceptionA) rootCause;
        } else {
            throw e;
        }
    }
}

それを機能させるには、から拡張するだけRuntimeExceptionです。

于 2011-03-14T13:51:50.547 に答える
1

Springs SimpleMappingExceptionResolver クラスを使用して巻き上げました

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="org.*.*.ResponseTimeExceededException">
                <!-- the name of the jsp to use for this exception -->
                error/timedout
            </prop>
        </props>
    </property>
    <property name="defaultErrorView" value="error/error"/>
</bean>
于 2011-03-14T14:08:37.997 に答える