【发布时间】:2016-03-01 23:10:00
【问题描述】:
我正在使用 Jersey 并实现了一个 ContainerRequestFilter。 现在我还想添加一个 ContainerResponseFilter 来为每个请求添加一个标头,但是当访问 web 服务时没有任何反应。
这是过滤器的样子:
public class ResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Cache-Control", "whatever");
}
}
我的球衣依赖:
compile 'org.glassfish.jersey.core:jersey-client:2.18'
compile 'org.glassfish.jersey.containers:jersey-container-servlet-core:2.18'
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.18'
我在这样的 xml 中注册提供程序:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>controller.webservice</param-value>
</init-param>
//This is the request filter, which is working fine
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>model.filter.AuthenticationFilter</param-value>
</init-param>
//Response filter, does not work
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>model.filter.ResponseFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
这不起作用,所以我尝试使用注释 @Provider 注册提供程序,并在 web 服务中像这样:
register(TokenModifier.class);
但这些都不起作用。我阅读了其他几篇文章,但找不到答案。有人对此有想法吗?
【问题讨论】:
-
您能否显示完整的 web.xml 以及您的 Jersey 相关依赖项列表
-
@peeskillet,我编辑了我的问题,你现在会看到它们
-
这只是一个猜测。我没有尝试过,也不知道是不是这个原因,但是如果你用逗号分隔 init-param 会发生什么,即将两个过滤器都放在
...classnamesinit-param,用逗号分隔。我只是猜测也许您只能拥有相同的 init-param 之一。但是我们可以在单个 init-param 中指定多个用逗号或分号分隔的组件 -
其次,
@Provider被包扫描发现。目前对于包扫描,您只列出了此包controller.webservice。因此,如果过滤器不在该包(或子包,如controller.webservice.filters)中,@Provider注释将不会被拾取。与..classnamesinit-param 一样,..packagesinit-param 也接受多个以逗号或分号分隔的包 -
太好了,在 xml 中添加过滤器所在的包并使用 Provider 对其进行注释就可以了。如果你把它写在答案中,我会接受它。非常感谢!
标签: java web-services jersey jax-rs