【问题标题】:Filters in JerseyTest 2.xJerseyTest 2.x 中的过滤器
【发布时间】:2013-12-23 13:54:22
【问题描述】:

我正在使用 JerseyTest v2.5 和 Grizzly 容器编写测试。我的资源依赖于我的 web.xml 中定义的过滤器,因此测试失败。

在使用 JerseyTest 时有没有办法配置 servlet 过滤器?

更好的是,有没有办法使用我的 web.xml 来配置 servlet 容器?

【问题讨论】:

  • 您使用的是什么类型的过滤器?能否请您发布您的资源代码和 web.xml?

标签: jersey jersey-2.0


【解决方案1】:

您可能已经看到了一个关于已经打开的问题:https://java.net/jira/browse/JERSEY-2259

最后好像

您目前无法注册 servlet 和过滤器类 与球衣测试框架同时进行(设置一个将删除另一个)。

这段话摘自this reply by Pavel Bucek

我想知道你是否看到它,他似乎找到了解决方法,但我不确定这是否适用于你。

您可以做的是将您的应用程序部署在(例如)嵌入式 glassfish 并使用对外部的支持对其运行测试 容器。执行测试的命令如下所示:

球衣版本 1.2+:

mvn 测试

  • Djersey.test.containerFactory=com.sun.jersey.test.framework.spi.container.external.ExternalTestContainerFactory

  • Djersey.test.port=XXX -Djersey.test.host=XXX

球衣版本1.1.5.1-:

mvn 测试

  • Djersey.test.containerFactory=com.sun.jersey.test.framework.spi.container.external.ExternalTestContainerFactory

  • DJERSEY_HTTP_PORT=XXX -DJERSEY_HOST_NAME=XXX

【讨论】:

    【解决方案2】:

    我没有测试它,但也许这对你有帮助。

    有一个过滤器

    public class MyFilter implements ContainerRequestFilter {
        @Context
        HttpServletRequest webRequest;
    
        @Override
        public void filter(ContainerRequestContext requestContext) throws IOException {
            final HttpSession session = webRequest.getSession();
            ......
    
        }
    }
    

    你可以定义你的资源配置类,然后注册你的过滤器

    import org.glassfish.jersey.server.ResourceConfig;
    import javax.ws.rs.ApplicationPath;
    
    @ApplicationPath("/rest")
    public class MyResourceConfig  extends ResourceConfig {
    
        // Initializes all resources from your REST package.
    
        public MyResourceConfig() {
            // add your package name to enable package scanning for resources.
            packages("com.myapp.rest");
            // or you can register your resource class directly
            register(YourResource.class);
            register(MyFilter.class);
        }
    }
    

    然后,在你的 Jersey Test 课程中

    @Override
    protected Application configure() {
        return new MyResourceConfig ();
    }
    

    或者以更简单的方式

    @Override
    protected Application configure() {
        return new ResourceConfig(YourResource.class).register(MyFilter.class);
    }
    

    如果您需要为过滤器设置属性,您可以这样做

    @Override
    protected Application configure() {
        return new MyResourceConfig ().property("property", "value");
    }
    

    @Override
    protected Application configure() {
        return new ResourceConfig(YourResource.class).register(MyFilter.class).property("property", "value");
    }
    

    【讨论】:

      【解决方案3】:

      在进一步研究之后,似乎不可能将 servlet 过滤器与 JerseyTest 结合起来 - 应该应用的任何东西都必须作为 Jersey/JAX-RS 过滤器来实现。

      要结合 servlet 过滤器进行测试,WAR 必须部署在 servlet 容器中(嵌入式或其他)。

      【讨论】:

        猜你喜欢
        • 2021-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-18
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多