我正在使用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
注释,那么它会按预期工作,但我不想在每个类上都这样做。
如何注册应用程序范围的过滤器?
答案 0 :(得分:0)
回答我自己的问题。
进一步阅读泽西源代码我发现@Provider注释对ResourceFilterFactory
或ContainerRequest/Response
没有任何作用。这些只能通过以下两种方式之一注册
使用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过滤器链中。