web-dev-qa-db-fra.com

Comment utiliser guice-servlet avec Jersey 2.0?

Existe-t-il un exemple de code montrant comment utiliser guice-servlet avec Jersey 2.0?

29
Gili

https://github.com/Squarespace/jersey2-guice semble être la première intégration authentique de Guice pour Jersey 2, mais elle nécessite la version 2.11+.

NOTE: Je n'ai pas testé cela, mais l'idée est bonne.

9
Gili

Oui, j'ai adapté un exemple et il est disponible ici - https://github.com/piersy/jersey2-guice-example-with-test

J'ai mis à jour l'exemple de code maintenant. Il comporte un test utilisant Jetty et un autre utilisant Tomcat.

5
PiersyP

Il existe une page sur le site officiel de HK2 concernant la mise en œuvre correcte de guice: https://javaee.github.io/hk2/guice-bridge.html

Vous devriez créer votre injecteur quelque chose comme ceci:

  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);
        }
    }

Et le code de la doc devrait être mis à jour comme:

   @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());
        }

    }

Utiliser la dépendance maven dans votre pom.xml

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

https://github.com/phxql/jersey2-guice ne fonctionne pas avec le maillot 2.22 et le guice 4.0.

3
Globber

Il s’agit d’un PoC minimum de travail qui relie ensemble Jersey 2 et Guice:

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

1
phXql

J'ai déjà fait dans cet exemple:

https://github.com/jbescos/tododev

Vous devez enregistrer la classe https://github.com/jbescos/tododev/blob/master/jersey2-guice/src/main/Java/es/tododev/rest/ApplyGuiceContextFilter.Java dans votre ResourceConfig, et l'injecteur de guice lié dans un 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 {}
}  

C'est la 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
ravenskater

GWizard inclut un module qui vous permet une intégration prête à l'emploi entre Jersey2 et Guice. Voici un exemple de service complet 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();
    }
}

Notez que ceci est basé sur l’adaptateur Squarespace jersey2-guice , qui risque de ne pas fonctionner correctement avec les futures versions ponctuelles de Jersey. GWizard propose également un module RESTEasy JAX-RS, qui est préféré.

Voici une entrée de blog à ce sujet qui pourrait vous aider: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

1
stickfigure

Pour ceux qui sont intéressés, un exemple d’intégration guice/jersey est disponible à l’adresse https://github.com/mycom-int/jersey-guice-aop .

0
devlearn

Voici un exemple utilisant Embedded Jetty (cela devrait probablement fonctionner aussi pour le serveur Jetty)

jetty-jersey-HK2-Guice-Paddle

Si vous prévoyez d'utiliser Guice pour votre application, tous les composants Guice injectés dans Jersey doivent être déclarés comme une liaison dans la configuration Guice.

Si vous ne voulez pas déclarer chaque liaison dans la configuration de Guice, vous trouverez un adaptateur ici:

injecteur guice-bridge-jit

0
Choi