Как использовать guice-сервлет с Джерси 2.0?

Есть ли пример кода, демонстрирующий, как использовать guice-servlet с Jersey 2.0?


person Gili    schedule 24.06.2013    source источник
comment
По какой-то конкретной причине вы хотите использовать guice-servlet? Jersey 2.0 полностью интегрирован с внедрением зависимостей HK2 из коробки, что (насколько я видел) очень похоже на Guice DI. Взгляните на stackoverflow. com/questions/16216759/ для получения дополнительной информации.   -  person joscarsson    schedule 07.09.2013
comment
@joscarsson, у меня нет желания изучать еще одну структуру DI. HK2 далеко не так развит, как Guice, как с точки зрения функциональности, так и с точки зрения сообщества.   -  person Gili    schedule 07.09.2013


Ответы (8)


https://github.com/Squarespace/jersey2-guice кажется первой подлинной интеграцией Guice для Джерси 2, но это требуется версия 2.11+.

ПРИМЕЧАНИЕ. Я не проверял это, но идея здравая.

person Gili    schedule 17.08.2014
comment
Я только что сделал быстрый пример использования jersey2-guice со встроенным Jetty на github.com/hansenc/jersey2. -guice-example и, похоже, работает так, как рекламируется. - person Chris H.; 19.12.2014
comment
Есть проблемы с Джерси 2.20+. 2.19 работает нормально. Проблема github.com/Squarespace/jersey2-guice/issues/32 Хороший пример nailedtothex.org/roller/kyle/entry/lean- пример-кота-82 - person Alex Chevelev; 14.11.2015
comment
Мы использовали Squarespace/jersey2-guice в производстве для нескольких веб-сервисов. Но сейчас (март 2018 г.) он застрял на Джерси 2.22.2. Я ищу альтернативу, совместимую с Jersey 2.25+. - person Manu Manjunath; 14.03.2018

Да, я адаптировал пример, и он доступен здесь — https://github.com/piersy/jersey2-guice-example-with-test

Я обновил код примера, у него есть тест с использованием причала и еще один с использованием tomcat.

person PiersyP    schedule 25.07.2013
comment
Работает только с Glassfish. Нужен более общий пример, который будет работать на Tomcat, Jetty и т. д. - person mjaggard; 25.07.2013
comment
Привет, mjaggard, я не уверен, что понимаю твою точку зрения, в опубликованном примере я использовал пристань, а не стеклянную рыбу? - person PiersyP; 25.07.2013
comment
Извините, наверное, меня смутило использование HK2. Почему это используется? - person mjaggard; 25.07.2013
comment
В настоящее время нет прямой интеграции Guice для Jersey2, но ее можно достичь, используя HK2 в качестве моста, см. hk2.java.net/guice-bridge/index.html - person PiersyP; 25.07.2013
comment
Я знаю, что это немного устарело, но идея с этим мостом иметь другой ResourceConfig для использования другого модуля Guice? (Скажем, в случае привязки к фиктивным реализациям для тестирования.) - person Myles; 27.09.2013
comment
Обновлен веб-сайт моста HK2-Guice: hk2.java.net/2.2. 0-b22/guice-bridge.html - person albogdano; 18.10.2013

На официальном сайте HK2 есть страница о правильной реализации guice: https://javaee.github.io/hk2/guice-bridge.html

Вы должны создать свой инжектор примерно так:

  public class GuiceConfig extends ResourceConfig {

        @Inject
        public GuiceConfig(ServiceLocator serviceLocator) {
            this();
            GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
            GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
            guiceBridge.bridgeGuiceInjector(GuiceListener.createBiDirectionalGuiceBridge(serviceLocator));
        }

        public GuiceConfig() {
            packages(Injections.packages);
            addProperties(Injections.propertiesMap);
        }
    }

И код из документа должен быть обновлен следующим образом:

   @WebListener
    public class GuiceListener extends GuiceServletContextListener {

        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            Locale.setDefault(Locale.ENGLISH);
            super.contextInitialized(servletContextEvent);
        }

        public static volatile Injector injector = null;

        @Override
        protected Injector getInjector() {
            return injector;

        }

        @SuppressWarnings("unchecked")
        private static Module getModule() {
            return binder -> {
                Injections.singletonInterfaces.forEach((i, c) -> binder.bind(i).to(c).in(Scopes.SINGLETON));
                Injections.singletonClasses.forEach(c -> binder.bind(c).in(Scopes.SINGLETON));
            };
        }

        static synchronized Injector createBiDirectionalGuiceBridge(ServiceLocator serviceLocator) {

            return GuiceListener.injector = createBiDirectionalGuiceBridge(serviceLocator, getModule());
        }

    }

Использование зависимости maven в вашем pom.xml

   <dependency>
        <groupId>org.glassfish.hk2</groupId>
        <artifactId>guice-bridge</artifactId>
        <version>2.3.0</version>
    </dependency>

https://github.com/phxql/jersey2-guice не работает с майкой 2.22. и гайд 4.0.

person Globber    schedule 26.01.2016
comment
Официальный мост ужасно сломан. См. java.net/jira/browse/HK2-139 и java.net/jira/browse/JERSEY-1950 для получения дополнительной информации. - person Gili; 27.01.2016

Это минимальный рабочий PoC, который связывает Jersey 2 и Guice вместе:

https://github.com/phxql/jersey2-guice

person phXql    schedule 07.08.2014
comment
-1, это не поддерживает внедрение типов guice в конструкторы. - person Gili; 08.08.2014
comment
В MyResource TimeService внедряется вместе с Guice, см. github.com/phxql/jersey2-guice/blob/master/src/main/java/de/ - person phXql; 11.08.2014
comment
Это не имеет значения. Мост HK2 не поддерживает внедрение конструктора. - person Gili; 17.08.2014
comment
Я не понимаю, если вы развернете войну на сервере приложений, она работает. - person phXql; 17.08.2014

Я уже сделал в этом образце:

https://github.com/jbescos/tododev

Вы должны зарегистрировать класс https://github.com/jbescos/tododev/blob/master/jersey2-guice/src/main/java/es/tododev/rest/ApplyGuiceContextFilter.java в ResourceConfig и инжектор guice привязан в AbstractModule.

@Provider
@PreMatching
public class ApplyGuiceContextFilter implements ContainerRequestFilter, ContainerResponseFilter {

    @Inject
    public ApplyGuiceContextFilter(ServiceLocator serviceLocator, Injector injector) {
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);

        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(injector);
    }

    @Override
    public void filter(final ContainerRequestContext requestContext) throws IOException {

    }

    @Override
    public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) throws IOException {}
}  

Это ResouceConfig:

public class RestConfig extends ResourceConfig {

    @Inject
    public RestConfig() {
        this(Guice.createInjector(new Module(){
            @Override
            public void configure(Binder arg0) {
                // TODO Auto-generated method stub
            }
        }));
    }

    // Test
    public RestConfig(Injector injector) {
        packages(ResourceSample.class.getPackage().getName());
        register(ApplyGuiceContextFilter.class);
        register(new LoggingFilter(Logger.getLogger(LoggingFilter.class.getName()), true));

        property(ServerProperties.TRACING, "ALL");
        register(new RestBinder(injector));
    }

    private static class RestBinder extends AbstractBinder{

        private final Injector injector;

        private RestBinder(Injector injector){
            this.injector = injector;
        }

        @Override
        protected void configure() {
            bind(injector).to(Injector.class);
        }

    }

}
person ravenskater    schedule 14.08.2014

GWizard включает модуль, обеспечивающий готовую интеграцию между Jersey2 и Guice. Вот пример полной службы JAX-RS:

public class Main {
    @Path("/hello")
    public static class HelloResource {
        @GET
        public String hello() {
            return "hello, world";
        }
    }

    public static class MyModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(HelloResource.class);
        }
    }

    public static void main(String[] args) throws Exception {
        Guice.createInjector(new MyModule(), new JerseyModule()).getInstance(WebServer.class).startJoin();
    }
}

Обратите внимание, что это основано на адаптере Squarespace jersey2-guice, который может не работать должным образом с будущей точкой выпуски Джерси. GWizard также предлагает модуль RESTEasy JAX-RS, который является предпочтительным.

Вот запись в блоге об этом, которая может помочь: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

person stickfigure    schedule 07.01.2015

Для тех, кто заинтересован, есть образец интеграции guice/jersey, доступный по адресу https://github.com/mycom-int/jersey-guice-aop.

person devlearn    schedule 21.03.2014
comment
Непонятно, что вы здесь делаете (особенно потому, что вы говорите об однонаправленном впрыске, но не объясняете, какое направление вы имеете в виду). Вам нужен двунаправленный мост, потому что Jersey всегда будет просить HK2 ввести (в котором вы можете захотеть, чтобы HK2 делегировал Guice) и, с другой стороны, когда вы просите Guice ввести объект, который содержит тип Jersey (например, UriInfo) вам нужен Guice для делегирования HK2 для внедрения. Короче говоря: однонаправленного моста недостаточно. - person Gili; 22.03.2014
comment
Возможно, чтобы уточнить: однонаправленного моста достаточно, чтобы ввести ресурсы Guice в Джерси. Если вы хотите использовать АОП и смешивать Guice и HK2, вам определенно нужен двунаправленный мост. - person devlearn; 24.03.2014
comment
Вам будет очень трудно не смешивать Guice и HK2. Я приведу конкретный пример: если вы вводите ресурс Джерси с помощью Guice, но он ссылается на UriInfo, тогда Guice потребуется делегировать HK2, чтобы получить экземпляр (но он не сможет этого сделать). - person Gili; 25.03.2014

Вот пример использования Embedded Jetty (вероятно, он должен работать и для сервера Jetty)

jetty-jersey-HK2-Guice-boilerplate

Если вы планируете использовать Guice для своего приложения, все компоненты Guice, внедренные в Джерси, должны быть объявлены как привязки в конфигурации Guice.

Если вы не хотите объявлять каждую привязку в конфигурации Guice, здесь есть адаптер:

guice-bridge-jit-injector

person Choi    schedule 03.07.2014