2015-12-09 10 views
8

Chciałbym zastąpić typowe wiązanie, ale zawsze miałem ten sam błąd "No implementation was bound".Dlaczego pojawia się błąd, gdy próbuję zastąpić ogólne powiązanie z Guice? (TypeLiteral)

Używam roboguice 3.

Oto exemple kodu, który używam:

public interface IParser<I, O> {} 

public class Parser1 implements IParser<String, String> { 
    IParser<String, String> mParser; 

    @Inject 
    public Parser1(IParser<String, String> parser) { 
     mParser = parser; 
    } 
} 

public class Parser2 extends Parser1 { 
    @Inject 
    public Parser2(IParser<String, String> parser) { 
     super(parser); 
    } 
} 

public class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1>() {}); 
    } 
} 

I tu jest moje stworzenie wtryskiwacz:

RoboGuice.getOrCreateBaseApplicationInjector(this, 
       RoboGuice.DEFAULT_STAGE, 
       RoboGuice.newDefaultRoboModule(this), 
       Modules.override(new MyModule()).with(new AbstractModule() { 
        @Override 
        protected void configure() { 
         bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser2>() {}); 
        } 
       }) 
); 

Gdybym don” t staraj się go przesłonić (tylko użytkownik Parser1), wszystko jest w porządku, kiedy nadpisuję standardowy obiekt dostawcom, działa to również, ale nie z TypeLiteral.

Mój błąd jest:

com.google.inject.CreationException: Unable to create injector, see the following errors: 
1) No implementation for IParser<String, String> was bound. 

Co robię źle?

Dzięki.

+0

Czy ktoś ma pojęcia? Czy Aurélien musi dostarczyć więcej informacji? –

+0

Nie mogę odtworzyć tego zachowania w Guice 4. Zauważyłem, że istnieje zależność cykliczna, którą Guice używa jako podkładki klasy proxy do spełnienia. Czy Roboguice może wyłączyć gdzieś proxy? – Cardano

+0

Nota boczna: nigdy nie potrzebujesz 'nowego TypeLiteral () {}', możesz po prostu użyć 'ASimpleType.class' – Cardano

Odpowiedz

1

Nie jestem shure, ale wygląda niezwykłe mi się, że wiązanie z conrete przykład jest używany zamiast do Class.

bind (nowy TypeLiteral>() {}) do (nowego TypeLiteral() {});

Próbowałaś

bind(new TypeLiteral<IParser<String, String>>() {}).to(Parser2.class}); 

?

+0

Powiązanie z literalną instancją typu jest równoznaczne z powiązaniem z klasą. – Cardano

6

Należy zmienić definicję klas zaimplementowanych w interfejsie.

Spróbuj tego:

public class Parser1<I, O> implements IParser<I, O> { 
} 
public class Parser2<I, O> extends Parser1<I, O> { 
} 

a następnie można powiązać swój interfejs do klasy w ten sposób:

bind(new TypeLiteral<IParser<String, String>>() {}).to(new TypeLiteral<Parser1<String, String>() {}); 
+0

Nie powinien wymagać parametrów typu w klasach implementacji, a dodanie ich nie będzie miało wpływu na sposób traktowania powiązania przez Guice. – Cardano

+0

W tym przypadku nie można uzyskać odpowiedzi "I" na typ w linii pierwszej. To nawet nie kompiluje. – vasigorc

Powiązane problemy