0

私の問題は、登録したエラー ハンドラ コードがすべてのエラーで機能しないことです。私の web.xml では、デフォルトのエラー ハンドラーを登録しました。

    <servlet>
        <servlet-name>ShowErrorHandlerServlet</servlet-name>
        <servlet-class>tools.ErrorHandlerServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ShowErrorHandlerServlet</servlet-name>
        <url-pattern>/showerror</url-pattern>
    </servlet-mapping>
    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/showerror</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/showerror</location>
    </error-page>
    <error-page>
        <location>/showerror</location>
    </error-page>

私はジャージーを使用して残りのリクエストをマップしています。たとえば、次のようなものです。

@GET
@Path("/throwError")
public void testThrowUnauthException() {
    // String s = null;
    // s.toString();
    // /*
    // * this nullpointer exception would be caught correctly because of
    // * <exception-type>java.lang.Exception</exception-type> in the web.xml
    // */
    throw new WebApplicationException(Response.Status.UNAUTHORIZED);
}

WebApplicationException はキャッチされず、デフォルトの jetty 401 エラー ページが表示されます。

HTTP エラー 401

/v1/locations/throwError へのアクセスに問題があります。理由:

UNAUTHORIZED 
Powered by Jetty

登録中

<error-page>
    <error-code>401</error-code>
    <location>/showerror</location>
</error-page>

動作しませんが、404 エラーに対しては動作します。

誰かがなぜこれが起こっているのか考えていますか? エラーを json エラー メッセージに変換するには、ErrorHandlerServlet ですべてのエラーをキャッチする必要があります。

4

1 に答える 1

0

Jersey は Jetty の動作をオーバーライドしていると思うので、XML の値を取得していません。それを解決する1つの方法(おそらく最もエレガントではない):

@Context HttpServletResponse res;
@GET
@Produces(MediaType.TEXT_HTML)
public String doFoo(){
    try {
        //Code that causes the error
    } catch (Exception e) {
        res.sendRedirect("/showError");
    }
    return "";
}

別のアイデアは、WebApplicationException を拡張し、応答を自分で管理することです (おそらく最良の方法です)。

于 2012-05-23T13:50:49.027 に答える