2014-12-26 28 views
10
@Provider 
public class JerseyExceptionMapper implements ExceptionMapper<JerseyException> { 


    @Override 
    public Response toResponse(JerseyException jerseyException) { 
     return Response.status(jerseyException.getErrorCode()). 
       entity(jerseyException.getJsonResponseObj()). 
       type(MediaType.APPLICATION_JSON). 
       build(); 
    } 

} 

碼錯誤頁面,當你在web.xml使用<error-page>組件的上方有不想要的結果。例如,如果我的Response.status設置爲400,而我的error-page組件定義的<error-code>爲400,則Web服務器將將請求重定向到web.xml中定義的位置。忽略的web.xml與新澤西州的ExceptionMapper

這顯然不是我想要的REST請求。我在StackOverflow上讀到另一篇文章,說請求被轉移到error-page的原因是因爲設置了HttpServletResponse.sendError(400)。該帖子說,如果你設置HttpServletResponse.setStatus(400)error-page將被忽略。

如果這是真的,我沒有看到它有什麼幫助,因爲我沒有實現澤西島代碼。我看到的選項是調查Response類源代碼,並可能重新實現狀態方法或其他澤西島代碼。這裏有一個簡單的選項或我錯過了什麼嗎?

從本質上講,我的問題是:由於我使用的是新澤西州的休息和我使用的錯誤頁面,我web.xml,我怎麼可以使用上面的代碼,而忽略error-page僅新澤西州代碼?任何其他導致HTTP錯誤的代碼都應該轉到error-page。或者是否有另一種解決方案不涉及error-page,但將與我想要的完全相同?

+0

哪個servlet容器是你使用?這可能與https://java.net/jira/browse/JERSEY-2673 –

+0

有關我無法重現此問題(glassfish 4球衣2.13)。 1)什麼是'JerseyException'? 2)您是否檢查過映射器是否被調用? 3)爲了完成這個工作,我只是做了一個'JerseyException'類擴展'WebApplicationException',並從資源方法中拋出它。 4)如果3.不能爲你工作,你能否提供更多的信息來重現這一點,比如環境,Jersey版本,服務器,哪裏出現異常。 –

回答

3

我可以重現該問題,但只有當我通過null作爲實體內容。

實施例:

return Response.status(400) 
     .entity(null) 
     .type(MediaType.APPLICATION_JSON) 
     .build(); 

甚至

return Response.status(400) 
     .type(MediaType.APPLICATION_JSON) 
     .build(); 

兩者都將導致重定向到其被設置爲HTTP狀態代碼400,因爲容器將使用錯誤頁如果沒有指定消息內容,則使用方法sendError()

但是,如果你不喜歡這樣寫道:

return Response.status(400) 
     .entity("An error occured.") 
     .type(MediaType.APPLICATION_JSON) 
     .build(); 

或本:

return Response.status(400) 
     .entity("") 
     .type(MediaType.APPLICATION_JSON) 
     .build(); 

集裝箱/球衣將只使用setStatus()方法並不會重定向到錯誤頁面。如在該文檔中指出:

此方法用於設置返回狀態碼當沒有 錯誤(例如,對於SC_OK或SC_MOVED_TEMPORARILY狀態 碼)。

如果使用此方法來設置錯誤代碼,那麼將不會觸發容器的錯誤頁面機制 機制。如果出現錯誤並且調用者希望調用Web 應用程序中定義的錯誤頁面,則必須使用sendError(int,java.lang.String)來代替 。

所以在你的情況下,問題似乎是jerseyException.getJsonResponseObj()返回null。您應該實施一個空檢查來避免這種情況。

對於Jersey 1.x,存在bug JERSEY-1557,它描述了問題,它沒有修復就關閉了,但建議使用空實體字符串作爲解決方法。
也有類似的bug開放新澤西2.X:JERSEY-2673

參見:

+0

我會給你賞金,因爲你提供了很好的信息。但是,我認爲發生在我的情況(你無法知道)發生的事情是entity()方法拋出的異常,因爲沒有找到MessageBodyWriter。該異常必須導致調用errorCode方法。一旦我將Genson JAR包含在我的項目中,我不會再遇到這些錯誤。 – KyleM