Инъекция зависимостей в Джерси с помощью Guice - PullRequest
4 голосов
/ 03 июля 2019

Я не могу использовать JerseyTest (v2.25) вместе с инъекцией зависимостей Guice. Моя текущая настройка вдохновлена ​​ответом на другой stackoverflow вопрос . Эта установка все еще пытается связать зависимость @Provides аннотированных классов через HK2, не пройдя мой тестовый пример. Если я удаляю вызов .packages() из своего теста ResourceConfig, кажется, что слушатель вообще не инициализирован, и все мои тестовые примеры возвращают 404.

Это моя текущая настройка теста на джерси:

public class MyTestSuite extends JerseyTest {

    @Override
    protected Application configure() {
        return new ResourceConfig().packages("com.example.api");
    }

    @Override
    protected DeploymentContext configureDeployment() {
        return ServletDeploymentContext.builder(configure())
                .addListener(GuiceConfig.class)
                .addFilter(GuiceFilter.class, "guiceFilter")
                .addFilter(ServletContainer.class, "jerseyFilter", Collections.singletonMap("javax.ws.rs.Application", JerseyConfig.class.getName()))
                .build();
    }
}

Вот классы, на которые ссылаются в контексте развертывания:

public class GuiceConfig extends GuiceServletContextListener {
    static Injector injector;

    @Override
    protected Injector getInjector() {
        injector = Guice.createInjector(new WebModule());
        return injector;
    }
}
public class JerseyConfig extends ResourceConfig {

    @Inject
    public JerseyConfig(ServiceLocator serviceLocator) {
        Injector injector = (Injector) serviceLocator.getService(ServletContext.class).getAttribute(Injector.class.getName());
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
        serviceLocator.getService(GuiceIntoHK2Bridge.class).bridgeGuiceInjector(injector.createChildInjector(new HK2IntoGuiceBridge(serviceLocator)));
        packages("com.example.api");
    }
}
public class WebModule extends ServletModule {

    @Override
    protected void configureServlets() {
        serve("/*").with(ServletContainer.class, Collections.singletonMap(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName()));
    }
}

1 Ответ

3 голосов
/ 07 июля 2019

Вместо того, чтобы писать свою собственную, вы можете использовать существующую библиотеку Jersey Guice Module

, вам необходимо преодолеть разрыв между двумя структурами DI.Этот модуль направлен именно на то, чтобы загрузить сервер Jersey на базе Jetty и инициализировать мост между HK2 и Guice.

Getting Started

  • Добавить JerseyModuleна ваш Guice Injector

  • Настройка пакетов для сканирования ресурсов и порта для выставления

  • Получить экземпляр JerseyServer и начать использовать ресурсы Restful

 compile 'io.logz:guice-jersey:1.0.8'

Обратите внимание, что вы пропали без вести GuiceIntoHK2Bridge

Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName()); 
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector(injector);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...