我正在使用JerseyTest v2.5和Grizzly容器编写测试。我的资源依赖于我的web.xml中定义的过滤器,因此测试失败。
使用JerseyTest时有没有办法配置servlet过滤器?
更好的是,有没有办法使用我的web.xml来配置servlet容器?
答案 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");
}