基于Grizzly的Jersey测试:如何用Spring Java配置搭建测试上下文?
如何让JerseyTest使用Spring Java上下文配置?
我正在使用JAX-RS、Jersey和Spring框架,当前的JAX-RS资源集成测试代码如下:
public class MyResourceIT extends JerseyTest { @Override protected Application configure() { return new ResourceConfig(MyResource.class); } @Test public void getHealth() { // some code } }
启动测试时出现如下错误:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:196)
我可以创建applicationContext.xml文件,但更希望使用Spring基于Java的容器配置来搭建测试上下文,请问如何实现?
解决步骤
1. 引入Jersey与Spring集成的依赖
根据你的Spring版本,添加对应的Jersey-Spring集成依赖,以Spring 4.x为例,Maven配置如下:
<dependency> <groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-spring4</artifactId> <version>你的Jersey版本</version> <scope>test</scope> </dependency>
2. 编写Spring Java配置类
创建基于注解的Spring配置类,替代XML配置:
@Configuration @ComponentScan(basePackages = "com.your.project.package") // 替换为你的资源、服务所在包路径 public class SpringTestConfig { // 可在此手动定义Bean,或通过@ComponentScan自动扫描组件 }
3. 修改JerseyTest配置,关联Spring Java上下文
调整configure方法,初始化Spring注解上下文并绑定到Jersey的ResourceConfig:
public class MyResourceIT extends JerseyTest { @Override protected Application configure() { // 初始化Spring注解配置上下文 AnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(SpringTestConfig.class); // 配置Jersey资源 ResourceConfig config = new ResourceConfig(MyResource.class); // 将Spring上下文注入Jersey config.property("contextConfig", springContext); // 注册Spring组件提供者,确保Jersey能识别Spring管理的Bean config.register(SpringComponentProvider.class); return config; } @Test public void getHealth() { // 示例测试逻辑 Response response = target("/health").request().get(); assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); response.close(); } }
原理说明
Jersey与Spring集成时,默认会尝试从类路径加载applicationContext.xml作为Spring配置文件。通过手动初始化AnnotationConfigApplicationContext并绑定到Jersey的ResourceConfig,可以让Jersey使用Spring的Java注解配置,不再依赖XML文件。
内容的提问来源于stack exchange,提问作者Harold L. Brown
相关产品推荐
相关产品推荐

