Як користуватися гінцеро-сервлетом з Джерсі 2.0?

Чи є який-небудь приклад коду, який демонструє, як використовувати GUI-сервлет з Jersey 2.0?

29
@ Джокарссон, у мене немає бажання навчитися ще одній системі DI. HK2 не настільки зрілий, як Guice як з функціональності, так і з точки зору спільноти.
додано Автор Gili, джерело
Будь-яка особлива причина, з якої ви хочете скористатися guice-servlet? Джерсі 2.0 повністю інтегрований з ін'єкційною залежністю HK2 від коробки, що (наскільки я бачив) дуже схожий на Guice DI. Погляньте на stackoverflow. com/questions/16216759/& hellip; для отримання додаткової інформації.
додано Автор joscarsson, джерело

8 Відповіді

https://github.com/Squarespace/jersey2-guice seems to be the first genuine Guice integration for Jersey 2 but it requires version 2.11+.

NOTE: I haven't tested this, but the idea is sound.

9
додано
Ми використовуємо Squarespace/jersey2-guice для виробництва декількох веб-сервісів. Але зараз (березень 2018 року) він застряг у Джерсі 2.22.2. Я дивлюся на альтернативу, яка сумісна з Jersey 2.25+.
додано Автор Manu M., джерело
Я просто зібрав короткий приклад, використовуючи jersey2-guice з вбудованим Jetty за адресою github.com/hansenc/jersey2 -Guice-приклад , і це, здається, працює як рекламована.
додано Автор Chris H., джерело
Є проблеми з Джерсі 2.20+. 2,19 працює нормально. Випуск github.com/Squarespace/jersey2-guice/issues/32 Хороший приклад nailedtothex.org/roller/kyle/entry/lean- приклад-точка-82
додано Автор Alex Chevelev, джерело

Yes, I've adapted an example and it's available here - https://github.com/piersy/jersey2-guice-example-with-test

Я оновив приклад коду зараз, отримавши тест з використанням причалу, а інший - за допомогою Tomcat.

6
додано
В даний час немає прямої інтеграції Guice для Jersey2, але це можна досягти, використовуючи HK2 як мост - hk2.java.net/guice-bridge/index.html
додано Автор PiersyP, джерело
Привіт mjaggard, я не впевнений, що я розумію вашу точку зору, у прикладі, що я використовував причал не скляна риба?
додано Автор PiersyP, джерело
Я знаю, що це стає трохи застарілим, але чи ідея з цим мостом мати інший ResourceConfig для використання іншого модуля Guice? (Скажімо, у випадку обов'язкового для реалізації макета для тестування.)
додано Автор Myles, джерело
Вибачте, я здогадуюсь, я заплутався за допомогою HK2. Чому це використовується?
додано Автор mjaggard, джерело
Працює лише з Glassfish. Потрібен більш загальний приклад, який буде працювати на Tomcat, Jetty та ін
додано Автор mjaggard, джерело
Оновлений веб-сайт для мосту HK2-Guice: hk2.java.net/2.2. 0-b22/guice-bridge.html
додано Автор albogdano, джерело

There is a page at HK2 official about correct guice implementation: https://javaee.github.io/hk2/guice-bridge.html

Ви повинні створити свій Injector щось на зразок цього:

  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

   
        org.glassfish.hk2
        guice-bridge
        2.3.0
    

https://github.com/phxql/jersey2-guice doesn't work with jersey 2.22 and guice 4.0.

3
додано
Офіційний міст жахливо розбитий. Див java.net/jira/browse/HK2-139 і java.net/jira/browse/JERSEY-1950 для отримання додаткової інформації.
додано Автор Gili, джерело

GWizard includes a module that gives you out-of-the-box integration between Jersey2 and Guice. Here's an example of a complete JAX-RS service:

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 модуль, який є кращим.

Here is a blog entry about this that might help: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

1
додано

Це мінімальна робоча PoC, яка проводить Jersey 2 і Guice разом:

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

1
додано
На жаль, ось що я мав на увазі: java.net/jira/browse/HK2-139
додано Автор Gili, джерело
Це не має значення. Міст HK2 не підтримує ін'єкцію конструктора.
додано Автор Gili, джерело
-1, це не підтримує типи введення типів в конструктори.
додано Автор Gili, джерело
У MyResource TimeService вводять Guice, див. github.com/phxql/jersey2-guice/blob/master/src/main/java/de/‌ & hellip;
додано Автор phXql, джерело
Я не можу це зробити, якщо ви розгортаєте війну на сервері додатків, це працює.
додано Автор phXql, джерело

Я вже зробив у цьому прикладі:

https://github.com/jbescos/tododev

Ви повинні зареєструвати клас https://github.com/jbescos/tododev/blob/master/jersey2-guice/src/main/java/es/tododev/rest/ApplyGuiceContextFilter.java у вашій ResourceConfig та ін'єктору прив'язаний до 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);
        }

    }

}
1
додано

Для тих, хто зацікавлений, є зразок інтеграції з гіркою/джерсі, доступний на сторінці https:// github. ru/mycom-int/jersey-guice-aop .

0
додано
Ви будете мати дуже важкий час, не змішуючи Guice і HK2. Я наведу конкретний приклад: якщо ви вводите ресурс Джерсі за допомогою Guice, але він називається UriInfo , тоді Guice потрібно делегувати HK2, щоб отримати екземпляр (але не зможе).
додано Автор Gili, джерело
Це незрозуміло, що ви робите тут (особливо тому, що ви говорите про односпрямовану ін'єкцію, але не пояснюєте, який напрямок ви маєте на увазі). Вам потрібен дворядковий мост, тому що Джерсі завжди запитає HK2 про ін'єкцію (в якому можна хотіти, щоб HK2 делегував Guice) і на зворотному боці, коли ви запитаєте Guice про введення об'єкта, який, як видається, містить тип Джерсі (наприклад, UriInfo) Вам потрібен Guice для делегування HK2 для ін'єкцій. Коротше кажучи: однонаправлений міст недостатньо.
додано Автор Gili, джерело
Можливо, щоб з'ясувати: унікальний міст достатньо для того, щоб вводити ресурси Guice в Джерсі. Якщо ви хочете використовувати AOP і змішувати Guice і HK2, то вам обов'язково потрібен двонаправлений міст.
додано Автор devlearn, джерело

Ось приклад, що використовує Embedded Jetty (він, мабуть, повинен працювати і на Jetty сервері).

jetty-jersey-HK2-Guice-bolerplate

Якщо ви плануєте використовувати Guice для вашої програми, усі компоненти Guice, введені в Джерсі, повинні бути оголошені обов'язковими в Guice config.

Якщо ви не хочете оголосити кожен обов'язковий файл у Guice config, тут є адаптер:

гінцево-мостовий інжектор

0
додано