【问题标题】:Jersey ResourceFilter and springJersey ResourceFilter 和 spring
【发布时间】:2013-04-24 18:25:05
【问题描述】:

我正在使用 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 注释,那么它会按预期工作,但我不想在每个类上都这样做。

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

【问题讨论】:

    标签: java filter jersey


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      回答我自己的问题。

      进一步阅读球衣源代码我发现@Provider 注释对ResourceFilterFactoryContainerRequest/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>
        

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-10-17
        • 2017-05-24
        • 1970-01-01
        • 2015-01-12
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多