1

我正在使用 Jersey 1.17 和 Jersey-Spring 1.8。

我正在尝试让球衣ResourceFilter正确安装。我希望这个过滤器是应用程序范围的。

我已经将 ResourceFilter 实现定义为 spring 中的一个 bean(在 XML 中定义)并用注解对其进行了@Provider注解。

@Provider
public class ContainerResourceFilterTest implements ResourceFilter
{
    public ContainerRequestFilter getRequestFilter()
    {
        return null;  //TODO
    }

    public ContainerResponseFilter getResponseFilter()
    {
        return null;  //TODO
    }
}

但是当我发送请求时它不会被击中。

如果我@ResourceFilters在特定资源上使用注释,那么它会按预期工作,但我不想在每个类上都这样做。

如何注册应用程序范围的过滤器?

4

2 回答 2

0

Jersey 不会扫描所有的类路径 - ResourceFilters 是它不会自动找到的东西之一。如果您使用的是ResourceConfig类,请注册您的 ResourceFilter 类:

@ApplicationPath("/myapp")
public class MyApplication extends ResourceConfig {
    public MyApplication() {
        packages(getClass().getPackage().toString());
        register(ContainerResourceFilterTest.class);
    }
}

然后 Jersey 将扫描该类以查找过滤器接口,创建一个实例(根据其文档,所有过滤器都是单例范围)并将其插入 Jersey 过滤器链。

于 2014-01-02T14:25:34.817 回答
0

回答我自己的问题。

ResourceFilterFactory进一步阅读球衣源代码后,我发现 @Provider 注释对or没有任何作用ContainerRequest/Response。这些只能通过以下两种方式之一注册

  • 使用 META-INF/服务
  • 使用 servlet 的 init 参数,例如在 web.xml 中

    <init-param>
        <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
        <param-value>com.my.path.ResourceFilterFactory</param-value>
    </init-param>
    

不知道为什么代码不检查为实现适当接口的@Providers 注册的spring bean。

值得注意的是,注册实现的类ResourceFilter不适用于上述任何一种方法。您必须这样做ResourceFilterFactory并拥有该返回ResourceFilter实现。

好消息是,一旦你让 jersey 知道需要注册的,它就会调用 spring 来提供这些类,以便自动布线等照常工作。

于 2013-04-30T19:42:51.037 回答