2013-04-30 113 views
1

我使用的是Jersey 1.17和Jersey-Spring 1.8。Jersey资源过滤器和弹簧

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

我已经在spring中定义了ResourceFilter实现(在XML中定义),并用@Provider注解对它进行了注释。

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

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

但是,当我在发送一个请求不被打到。

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

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

回答

0

回答我自己的问题。

进一步阅读球衣源代码我发现@Provider注释不会为ResourceFilterFactoryContainerRequest/Response做任何事情。这些只能在下列2种方式

  • 使用META-INF /服务
  • 使用servlet的初始化参数之一来登记,例如在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的注册弹簧bean。

值得注意的是,注册实现ResourceFilter的类不适用于上述任何一种方法。您必须为ResourceFilterFactory执行此操作,并返回ResourceFilter实现。

好消息是,一旦你已经让球衣知道需要注册它调用到春天提供这些类自动布线等工程按惯例。

0

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

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

泽西将扫描该类的过滤器接口,创建一个实例(所有过滤器是根据自己的文档单范围),并将其插入到泽西岛过滤器链。