2014-10-17 50 views
1

我已經使用澤西島實施了一些(REST)服務。如果有不好的請求球衣處理錯誤,並回答一些JSON內容。有一個ExceptionMapper應該抓住一切:如何一致處理球衣和tomcat錯誤?

public class MyExceptionMapper implements ExceptionMapper<Throwable> 

但是,如果有一個無效的HTTP請求 - 例如無效的內容類型 - 在球衣有機會之前,tomcat處理異常。由此產生的響應是一些醜陋的tomcat HTML錯誤頁面,而不是所需的JSON。

我知道可以在部署描述符中設置<error-page>,但是我無法訪問任何錯誤詳細信息。

有沒有辦法阻止tomcat捕獲這個錯誤?如果是這樣,澤西可以用它的ExceptionMapper來捕獲它並返回正確的響應。

回答

2

你知道你可以設置一個「錯誤頁面」,但是你指的是什麼?如果它只是一個靜態網頁,那麼是的,你將無法訪問錯誤細節。但是,如果你把它轉發到正在處理錯誤由一個servlet,那麼你應該對你的錯誤的詳細信息,並且可以通過控制回球衣等

web.xml中:

<error-page> 
    <error-code>415</error-code> 
    <location>/InvalidContentHandler</location> 
    </error-page> 
    <error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/InvalidContentHandler</location> 
    </error-page> 

注:在上面的web.xml中,你應該用你所遇到的實際異常類型,你可以用「中的javax.servlet.error.exception」得到更換的java.lang.Throwable屬性,如下所示。

InvalidContentHandler.java:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    processError(request, response); 
} 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    processError(request, response); 
} 

private void processError(HttpServletRequest request, HttpServletResponse response) throws IOException { 

    // Pass control to Jersey, or get some info: 
    Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception"); 
    Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); 
    String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name"); 
    String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri"); 
    ... 
}