泽西岛2.3拦截器示例不起作用

Jim*_*mbo 3 rest jersey jersey-2.0

我正在尝试使用Tomcat 7和名称绑定在这里找到 Jersey 2.3 Interceptor示例.我根据链接中显示的示例创建了以下内容...

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Compress{}
Run Code Online (Sandbox Code Playgroud)

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

@Path("helloword")
public class HelloWorldResource {

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

我没有在web.xml中添加任何额外的东西来注册Interceptor,因为用户指南文档中没有讨论过.我注意到这是泽西岛早期版本中使用的方法.

我测试了压缩拦截器是否使用从jersey客户端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>
.
.......
Run Code Online (Sandbox Code Playgroud)

这没效果.我是否使用WriterInterceptor的参数名称注册GZIPWriterInterceptor?

更新 - 我已经设法通过扩展javax.ws.rs.core.Application并注册我需要的每个类(HelloWorldResource.class,GZIPWriterInterceptor.class,Compress.class)来使压缩工作,如部署不可知应用程序模型中所述在这里找到.

我在web.xml中注册了我的Application类...

<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>
Run Code Online (Sandbox Code Playgroud)

我按照例4.2扩展ResourceConfig尝试注册我的包失败了.并通过web.xml的早期方法

<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.test.jersey</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

目前还不清楚为什么包注册不起作用.

Mic*_*dos 5

您需要做两件事:

  1. 从提供的代码片段看,您WriterInterceptor的注释似乎没有@Compress.请这样做以确保您的提供者和资源方法匹配在一起.
  2. 您需要在JAX-RS Application类中注册提供程序或通过web.xml.文档可能对此有点模糊(我们将解决这个问题).

  • 你的param-name错了.它应该是`jersey.config.server.provider.classnames`而不是`com.ws.rs.ext.WriterInterceptor`. (4认同)

小智 5

拦截器类也必须被注释@Provider,如下所示:

@Provider
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor { ...
Run Code Online (Sandbox Code Playgroud)

这将在包扫描中被提取。

这里的文档没有明确指定。