2014-01-15 45 views
2

與針織/ JAX-RS 2響應體干擾,我有以下堆棧一個REST API防止Tomcat的從HTTP錯誤狀態4XX或5XX

  • 澤西2/JAX RS 2.0
  • Tomcat的7.0。 47
  • 傑克遜2

我的目標是當出現錯誤時有一個自定義響應體。我希望能夠向客戶端發送一個解釋,以便更容易地進行調試。

首先,我試圖用@Context HttpServletResponse並設置HTTP狀態代碼存在,但它是由球衣忽略(這是正常的行爲,但是這超出了我的理解)

然後我tryed使用WebApplicationException這樣的:

@GET 
@Path("/myapi") 
public BaseResponse getSomething() { 
    BaseResponse b = new BaseResponse(); 
    if(error) { 
     b.setStatusDescription("reason for error"); 
     throw new WebApplicationException(Response.status(Response.Status.CONFLICT).entity(b).build()); 
    } 
    //add content to BaseReponse 
    return b 
} 

但Tomcat的返回我的財產以後這樣的:

<html> 
    <head> 
     <title>Apache Tomcat/7.0.47 - Error report</title> 
     <style> 
      <!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22p 

這是標準的Tomcat HTML輸出C通過我希望返回的響應身體的長度(.entity(b) - 長度b)應對。所以它被認可,但Tomcat只是用它自己的錯誤頁面覆蓋它。

作爲一個方面說明我還試圖只是相同的結果返回的響應:

return Response.status(Response.Status.CONFLICT).entity(b).build() 

那我怎麼告訴Tomcat的離開我,讓我自己反應過來嗎?

+0

澤西調用'HttpServletResponse.sendError()' - 和因此調用servlet容器的'誤差page'機構-似乎違反JAX-RS 2的3.3.3節。0,它表示返回一個'Response'「導致一個實體主體映射到'Response'的實體屬性中。 – Mike

回答

0

問題是我正在使用ehcache中的GzipServlet,它似乎不適合與澤西島合作。在多個階段中,響應包裝器會拋出異常。

這是ehcache的的依賴性:

 <dependency> 
      <groupId>net.sf.ehcache</groupId> 
      <artifactId>ehcache-web</artifactId> 
      <version>2.0.4</version> 
     </dependency> 

而使用碼頭的Servlet在web.xml

<filter> 
     <filter-name>GzipFilter</filter-name> 
     <filter-class>net.sf.ehcache.constructs.web.filter.GzipFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>GzipFilter</filter-name> 
     <url-pattern>/rest/*</url-pattern> 
    </filter-mapping> 

有問題的servlet定義作爲替代林現在:http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/servlets/GzipFilter.html

<dependency> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-servlets</artifactId> 
      <version>8.1.0.RC5</version> 
     </dependency> 

web.xml

<filter> 
    <filter-name>GzipFilter</filter-name> 
    <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class> 
    <init-param> 
    <param-name>mimeTypes</param-name> 
    <param-value>text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>GzipFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

作爲免責聲明:是的我知道我可以在tomcat配置中激活gzip,但是我正在編寫一個測試服務器,必須能夠有和沒有gzip的端點。

相關問題