Jersey ContainerResponseFilter无法正常工作

时间:2016-03-01 23:10:00

标签: java web-services jersey jax-rs

我正在使用 Jersey ,我实现了一个ContainerRequestFilter。 现在我还想添加一个 ContainerResponseFilter 来为每个请求添加一个标题,但是当访问webservice时没有任何反应。

这是过滤器的样子:

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);

但这些都没有奏效。我读了几篇其他帖子,但我找不到答案。有没有人想过这个?

1 个答案:

答案 0 :(得分:2)

这个init-param

<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>controller.webservice</param-value>
</init-param>
Jersey使用

扫描为@Path@Provider注释类列出的包,并注册它们。列出的包将被递归扫描。因此,例如,使用您当前的配置,将扫描以下所有包

controller.webservice
controller.webservice.x
controller.webservice.x.y
controller.webservice.x.y.z 

param的值也可以是用逗号或分号分隔的多个值。因此,如果您的过滤器位于不同的包基础中,则可以将该包添加到要扫描的包列表中

<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>controller.webservice, com.my.filters</param-value>
</init-param>

就个人而言,如果我使用web.xml,我将只使用一个基本包,并从该包扩展所有其他包。像

这样的东西
com.company.app
com.company.app.domain
com.company.app.filters
com.company.app.resources

然后你可以把com.company.app作为init-param值,所有其他子包也会被扫描。