【发布时间】: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