2013-11-01 50 views
3

我試圖使用Tomcat 7和名稱綁定工作來獲得Jersey 2.3攔截器示例found here。我創建了以下按在鏈接中所示的例子...Jersey 2.3攔截器示例不工作

@NameBinding 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Compress{} 

@Compress 
public class GZIPWriterInterceptor implements WriterInterceptor { 
@Override 
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { 
    final OuputStream outputStream ..... 
    ..some logging added here.. 
} 

@Path("helloword") 
public class HelloWorldResource { 

    @GET 
    @Path("to-much-data") 
    @Compress 
    public String getVeryLongString(){ 
    String str = "a very ... 
    ..... large string"; 
    return str; 
    } 
} 

我還沒有添加任何額外的網絡.xml註冊Interceptor,因爲這在用戶指南文檔中沒有討論。我注意到這是澤西島版本中使用的方法。

我測試了壓縮攔截器是否使用了從澤西客戶端api構建的客戶端。我確保在發送請求之前將HttpHeaders.ACCEPT_ENCODING, "gzip"標題添加到Invocation.Builder。我還將日誌記錄添加到GZIPWriterInterceptor。當我測試以查看響應是否壓縮時,它會以純文本形式返回(Content-Type - text/plain設置在響應頭中),並且在日誌中看不到GZIPWriterInterceptor消息。

有沒有人有任何想法我做錯了什麼,或者我可以嘗試什麼?

編輯 - 我更新了我的web.xml,嘗試註冊GZIPWriterInterceptor類。

...... 
. 
<servlet> 
    <servlet-name>Jersey Test Servlet</servlet-name> 
    <servlet-value>org.glassfish.jersey.servlet.ServletContainer</servlet-value> 
    <init-param> 
    <param-name>jersey.config.server.provider.packages</param-name> 
    <param-value>com.test.jersey</param-value> 
    </init-param> 
    <init-param> 
    <param-name>com.ws.rs.ext.WriterInterceptor</param-name> 
    <param-value>com.test.jersey.GZIPWriterInterceptor</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
. 
....... 

這沒有奏效。註冊GZIPWriterInterceptor的參數名稱是WriterInterceptor還是別的?

UPDATE - 我已經成功地得到壓縮通過擴展javax.ws.rs.core.Application並註冊爲discribed每個類我需要(HelloWorldResource.class,GZIPWriterInterceptor.class,Compress.class)工作在部署不可知應用程序模型found here中。

我註冊了我的應用程序類在web.xml ...

<display-name>JerseyInterceptorTest2</display-name> 
    <servlet> 
    <servlet-name>Jersey Rest Test</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.jersey.test.MyApplication</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Jersey Rest Test</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

我曾嘗試通過延長ResourceConfig按照例4.2註冊我的包。並通過更早的方法通過web.xml

<init-param> 
    <param-name>jersey.config.server.provider.packages</param-name> 
    <param-value>com.test.jersey</param-value> 
</init-param> 

它仍然不清楚爲什麼包註冊不起作用。

回答

5

有你需要做兩件事情:

  1. 從提供的代碼片斷它似乎並不認爲你WriterInterceptor標註有@Compress註解。請這樣做,以確保您的提供者和資源方法匹配在一起。
  2. 您需要在您的JAX-RS Application課程中或通過web.xml註冊供應商。文檔可能對此有點模糊(我們將解決這個問題)。
+0

感謝Michal,我添加了@Compress並更新了web.xml以包含我認爲需要註冊的GZIPWriterInterceptor。我將添加此作爲編輯我的原始問題。 –

+4

你的參數名稱是錯誤的。它應該是'jersey.config.server.provider.classnames'而不是'com.ws.rs.ext.WriterInterceptor'。 –

+0

我已經在web.xml中。我正在使用包來註冊提供者。 –

4

攔截器類必須與@Provider被標註過,像這樣:

@Provider 
@Compress 
public class GZIPWriterInterceptor implements WriterInterceptor { ... 

這隨後會在一個包掃描回升。

文檔here未明確指定。

0

確保所有類(Compress,GZIPWriterInterceptor,HelloWorldResource)都位於web.xml中由參數「jersey.config.server.provider.packages」指定的相同包中。

發生在我身上的情況是@NameBinding無法正常工作,並且我發現我將Compress放入了另一個包中。

0
  1. 不要忘了把@Provider註釋上述作家班
  2. 看跌期權,壓縮和在同一個包資源
  3. (最重要的):註冊應用類的類:
 @ApplicationPath("myrest") 
     public class MyRestApplication extends Application{ 

     @Override 
     public Set<Object> getSingletons() { 

      Set<Object> singletons = new HashSet<Object>(); 
      singletons.add(new AuthorResource()); 
      singletons.add(new GZipWriterInterceptor()); 
      singletons.add(new EncodingFilter()); 
      singletons.add(new GZipEncoder()); 
      return singletons; 
      } 
     }