12

我们正在将我们的一些数据服务从使用 jersey-spring 的 Jersey 1.x 迁移到使用 jersey-spring3 的 Jersey 2.x。

我们有几个继承自 JerseyTest 的测试类。其中一些类使用 web.xml 文件中未指定的自定义 applicationContext.xml 文件。

在 Jersey 1.x 中,扩展 JerseyTest 的测试类可以使用 WebappDescriptor.Builder 调用超级构造函数,可以将上下文参数传递给该构造函数以设置或覆盖应用程序上下文路径。

例如

public MyTestClassThatExtendsJerseyTest()
{
    super(new WebAppDescriptor.Builder("com.helloworld")
    .contextParam( "contextConfigLocation", "classpath:helloContext.xml")
    .servletClass(SpringServlet.class)
    .contextListenerClass(ContextLoaderListener.class)
    .requestListenerClass(RequestContextListener.class).build());
}

Jersey 2.x 如何实现同样的效果?

我已经梳理了API 文档用户指南和一些来源,但无法找到答案。

4

2 回答 2

8

这对我不起作用,因为我没有使用 .xml 样式配置,而是使用@Configuration注释。所以我必须直接将应用程序上下文提供给 ResourceConfig 类。

我在我的 JerseyTest 中定义了 configure 方法,如下所示:

@Override
protected Application configure() {
  ResourceConfig rc = new ResourceConfig();

  AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
  rc.property("contextConfig", ctx);
}

其中 SpringConfig.class 是我的带有@Configuration注释和导入的类org.springframework.context.annotation.AnnotationConfigApplicationContext

于 2014-07-03T11:15:13.083 回答
7

让我们假设你的Application样子:

@ApplicationPath("/")
public class MyApplication extends ResourceConfig {

    /**
     * Register JAX-RS application components.
     */
    public MyApplication () {
        // Register RequestContextFilter from Spring integration module. 
        register(RequestContextFilter.class);

        // Register JAX-RS root resource.
        register(JerseySpringResource.class);
    }
}

您的 JAX-RS 根资源,例如:

@Path("spring-hello")
public class JerseySpringResource {

    @Autowired
    private GreetingService greetingService;

    @Inject
    private DateTimeService timeService;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getHello() {
        return String.format("%s: %s", timeService.getDateTime(), greetingService.greet("World"));
    }
}

而且你有helloContext.xml直接从你的类路径中命名的弹簧描述符。现在您想getHello使用 Jersey 测试框架测试您的资源方法。您可以像这样编写测试:

public class JerseySpringResourceTest extends JerseyTest {

    @Override
    protected Application configure() {
        // Enable logging.
        enable(TestProperties.LOG_TRAFFIC);
        enable(TestProperties.DUMP_ENTITY);

        // Create an instance of MyApplication ...
        return new MyApplication()
                // ... and pass "contextConfigLocation" property to Spring integration.
                .property("contextConfigLocation", "classpath:helloContext.xml");
    }

    @Test
    public void testJerseyResource() {
        // Make a better test method than simply outputting the result.
        System.out.println(target("spring-hello").request().get(String.class));
    }
}
于 2013-08-16T19:14:45.500 回答