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