Ich bin neu in Guice. Ich benutze Guice in Verbindung mit AWS SWF. Meine aktuelle Struktur in wie folgt:Mit Guice: Keine Implementierung begrenzt
Mainclass:
class MainClass {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new ClientModule(param1, param2));
injector = injector.createChildInjector(injector.getInstance(TestModule.class));
}
}
Testmodule:
class TestModule extends AbstractModule {
@override
protected void configure() {
// create SWF service object
// Register Workflow worker and Activity worker
TempWorkflowClientExternalFactory fac = TempClientExternalFactoryImpl(swf_service, domain);
bind(TempWorkflowClientExternalFactory.class).annotatedWith(Names.named("ABC")).toInstance(fac);
}
}
Definition der Klasse, wo ich will, es zu benutzen:
class Test {
@Inject
@Named("ABC")
TempWorkflowClientExternalFactoryImpl fac;
public void method() {
TempWorkflowClientExternal temp = fac.getClient("123");
temp.callWorkflowMethod() // This method is defined in SWF Workflow Activity class
}
}
jedoch bei der Ausführung I den folgenden Fehler erhalten:
No implementation for <packageName>.TempWorkflowClientExternalFactoryImpl annotated with @com.google.inject.name.Named(value=ABC) was bound
Ich brauche das gleiche Objekt zurückgegeben werden, wo TempWorkflowClientExternalFactory injiziert wird. Ich habe versucht, Guice Wiki/FAQ nachschlagen. Leider denke ich, dass ich etwas übersehe oder ein Konzept missverstanden habe.
Wenn ich anstelle der Bindung den folgenden Code in configure
Methode nach dem Erstellen der fac
Objekt verwenden, funktioniert meine Anwendung wie erwartet.
TempWorkflowClientExternal temp = fac.getClient("123");
temp.callWorkflowMethod()
Wenn ich jedoch versuche zu binden, schlägt es fehl.
Update: Wenn ich die Bindung ohne die annotatedWith
ausführen, führt das Programm, aber ich kann feststellen, dass die Bindung nicht korrekt als Objekt fac
in Test
Klasse erfolgt wird mit Standard-Konstruktor instanziiert und nicht das Objekt, das ich mit verknüpfen möchten
Weitere Details: TempWorkflowClientExternalFactoryImpl, TempWorkflowClientExternalFactory, TempWorkflowClientExternal sind ebenfalls automatisch generierte Klassen von AWS-SWF. Ich kann ihre Konstruktoren nicht ändern oder Anmerkungen in diesen Klassen hinzufügen. Test.method() wird aufgerufen, wenn bestimmte Geschäftslogikkriterien erfüllt sind.
Kann jemand bitte helfen, wie man den Fehler auflöst?
Wie konstruieren Sie die 'Injector'? Ist Ihr 'TestModule' tatsächlich im Injektor installiert? Es würde helfen, wenn Sie ein [mcve] bereitstellen könnten. –
Ja, ich habe das TestModul im Injektor installiert. Da Code eine Verbindung mit AWS SWF mit Anmeldeinformationen enthält, kann ich kein vollständiges Beispiel veröffentlichen. Ich habe den Verbindungscode durch den gleichen Kommentar ersetzt. Alles andere ist wie im Code. Ich habe auch die Frage zu dem Ende aktualisiert, das die automatisch generierten Klassen erwähnt, die ich zu binden versuche. – learningMyWayThru