tutorial nfl google java dependency-injection annotations guice

nfl - No se realizó ninguna implementación-Java Guice



guice nfl (2)

A primera vista, parece que le faltan los enlaces para la dependencia anotada de Db y el StatsdClient.

Tendrás que proporcionar los enlaces que faltan a tu módulo como tal

bind(Db.class).annotatedWith(SystemDb.class).to(DbImplOfSomeSort.class); bind(StatsdClient.class).to(StatsdClientImplOfSomeSort.class);

Guice puede inyectar automáticamente Concrete Class con un constructor público sin argumentos o un constructor con @Inject sin ningún enlace específico definido en su módulo, pero cuando se trata de interfaces debe definir los enlaces necesarios.

Aquí Db.class y StatsdClient.class son interfaces que debe vincular a la implementación específica.

Aquí el novato intenta usar una aplicación falsa de Java que usa Guice para inyectar una dependencia de base de datos en la fábrica de Facebook, pero continúa teniendo el error de Guice diciéndome:

### Sin implementación para com.example.storage.Db anotado con @ com.example.storage.annotations.SystemDb () se enlazó mientras se encontraba com.example.storage.Db anotado con @ com.example.storage.annotations.SystemDb () para el parámetro 0 en com.example.facebook.client.exceptions.FacebookExceptionHandlerDb en com.example.facebook.client.guice.FacebookClientModule.configure

### No se pudo encontrar un constructor adecuado en com.example.facebook.statsd.StatsdClient. Las clases deben tener un constructor (y solo uno) anotado con @Inject o un constructor de cero argumentos que no sea privado. en com.example.facebook.statsd.StatsdClient.class mientras se encuentra com.example.facebook.statsd.StatsdClient para el parámetro 1 en com.example.facebook.client.exceptions.FacebookExceptionHandlerDb. com.example.facebook.client.guice.FacebookClientModule.configure

Código para la aplicación:

app.java

package com.example.facebook; import com.google.inject.Guice; import com.restfb.Connection; import com.restfb.types.Post; import com.example.facebook.client.FacebookClientFactory; import com.example.facebook.client.RobustFacebookClient; import com.example.facebook.client.guice.FacebookClientModule; import com.example.facebook.statsd.StatsdClient; public class App { public static void main ( String[] args ) { final FacebookClientFactory facebookClientFactory = Guice.createInjector(new FacebookClientModule()).getInstance(FacebookClientFactory.class); //error from line above final RobustFacebookClient robustFacebookClient = facebookClientFactory.create("accessToken"); //more ... }

El error resultante me indica el enlace de FacebookClientModule :

FacebookClientModule.java

public class FacebookClientModule extends AbstractModule { bind(FacebookExceptionHandler.class).to(FacebookExceptionHandlerDb.class); //error resulting from the failed binding on the FacebookExceptionHandlerDB class install(new FactoryModuleBuilder() .implement(FacebookClient.class, RobustFacebookClient.class) .build(FacebookClientFactory.class)); }

}

Donde dentro de la clase FacebookExceptionHandleDB el constructor tiene la inyección:

FacebookExceptionHandlerDB.java

public class FacebookExceptionHandlerDb implements FacebookExceptionHandler { // list of class String variables ... private final FacebookErrorParser parser; private final Db db; private StatsdClient statsd; @Inject public FacebookExceptionHandlerDb(@SystemDb Db db, StatsdClient statsd, FacebookErrorParser parser) { this.db = db; this.statsd = statsd; this.parser = parser; } }

Por lo que puedo ver, la inyección de dependencia para los parámetros cero y uno, db y statsD respectivamente, está fallando. ¿Podría alguien indicar dónde o qué falta en el código de la aplicación?


No es el origen del problema en este caso particular, pero me encontré con este problema cuando tuve mis clases de implementación e interfaz al revés:

public class MyModule extends AbstractModule { @Override public void configure() { bind(MyClassImpl.class).to(MyInterface.class); } }

Debería haber sido:

bind(MyInterface.class).to(MyClassImpl.class);