Jersey ResourceFilter和春天

时间:2013-04-30 18:24:39

标签: java filter jersey

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

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

我在Spring中将ResourceFilter实现定义为bean(在XML中定义),并使用@Provider注释对其进行注释。

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

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

但是当我发送请求时,它不会受到影响。

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

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

2 个答案:

答案 0 :(得分:0)

回答我自己的问题。

进一步阅读泽西源代码我发现@Provider注释对ResourceFilterFactoryContainerRequest/Response没有任何作用。这些只能通过以下两种方式之一注册

  • 使用META-INF / services
  • 使用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实现。

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

答案 1 :(得分:0)

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

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

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