【问题标题】:Jersey 2.3 Interceptor Example not workingJersey 2.3 拦截器示例不起作用
【发布时间】:2013-11-12 16:12:15
【问题描述】:

我正在尝试使用 Tomcat 7 和名称绑定来让 Jersey 2.3 拦截器示例 found here 工作。我根据链接中显示的示例创建了以下内容...

@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;
  }
}

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

我测试了压缩拦截器是否使用从球衣客户端 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 还是别的?

更新 - 通过扩展 javax.ws.rs.core.Application 并注册我需要的每个类(HelloWorldResource.class、GZIPWriterInterceptor.class、Compress.类)如部署不可知应用程序模型found here 中所述。

我在 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>

我尝试按照示例 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>

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

【问题讨论】:

    标签: rest jersey jersey-2.0


    【解决方案1】:

    你需要做两件事:

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

    【讨论】:

    • 感谢 Michal,我添加了 @Compress 并更新了 web.xml 以包含我认为注册 GZIPWriterInterceptor 所需的内容。我会将其添加为对原始问题的编辑。
    • 您的参数名称错误。它应该是jersey.config.server.provider.classnames 而不是com.ws.rs.ext.WriterInterceptor
    • 我在 web.xml 中有这个。我正在使用包来注册提供程序。
    【解决方案2】:

    拦截器类也必须用@Provider注解,像这样:

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

    这将在包裹扫描中被提取。

    文档here 没有明确指定。

    【讨论】:

      【解决方案3】:

      确保所有类(Compress、GZIPWriterInterceptor、HelloWorldResource)都在web.xml中参数“jersey.config.server.provider.packages”指定的同一个包下。

      我想到了@NameBinding 不起作用的情况,我发现我将 Compress 放入了另一个包中。

      【讨论】:

        【解决方案4】:
        1. 不要忘记将@Provider 注解放在 writer 类之上
        2. 将Writer、Compress和资源放在同一个包中
        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;
                  } 
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-07
          • 2017-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多