Existe-t-il un exemple de code montrant comment utiliser guice-servlet avec Jersey 2.0?
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.
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.
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.
Il s’agit d’un PoC minimum de travail qui relie ensemble Jersey 2 et Guice:
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);
}
}
}
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
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 .
Voici un exemple utilisant Embedded Jetty (cela devrait probablement fonctionner aussi pour le serveur Jetty)
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: