Укажите контекст пользовательского приложения

Мы переносим некоторые наши сервисы передачи данных от Jersey 1.x, используя jersey- spring к Jersey 2.x, используя jersey-spring3.

У нас есть несколько тестовых классов, которые наследуются от JerseyTest. Некоторые из этих классов используют пользовательские файлы applicationContext.xml, которые не указаны в файле web.xml.

В Джерси 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());
}

Как можно добиться этого с помощью Джерси 2.x?

Я прочитал API docs, руководства пользователя и некоторые источники но не смогли найти ответ.

Спасибо.

Ответ 1

Предположим, что ваш 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"));
    }
}

И у вас есть дескриптор spring с именем 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));
    }
}

Ответ 2

Это не сработало для меня, поскольку я не использовал конфигурацию стиля .xml, я использовал аннотации @Configuration. Поэтому мне пришлось напрямую предоставить контекст приложения классу ResourceConfig.

Я определил метод configure в своем JerseyTest так:

@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