在JerseyTest 2.x中过滤

时间:2013-12-23 13:54:22

标签: jersey jersey-2.0

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

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

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

3 个答案:

答案 0 :(得分:9)

有一个问题已经打开,您可能已经看过:https://java.net/jira/browse/JERSEY-2259

最终,似乎

  

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

此引用取自this reply by Pavel Bucek

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

  

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

     

球衣版1.2+:

     

mvn test

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

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

  •   
     

jersey版本1.1.5.1-:

     

mvn test

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

  •   
  • DJERSEY_HTTP_PORT = XXX -DJERSEY_HOST_NAME = XXX

  •   

答案 1 :(得分:2)

在进一步研究之后,似乎无法将servlet过滤器与JerseyTest结合起来 - 无论应用什么都必须实现为Jersey / JAX-RS过滤器。

要与servlet过滤器结合使用,必须将WAR部署在servlet容器中(嵌入式或其他方式)。

答案 2 :(得分:1)

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

有过滤器

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);
    }
}

然后,在你的泽西岛测试课

@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");
}