2011-01-12 4 views
5

Secondo il ThrowingProvider documentazione Guice Ho la seguente interfaccia:Guice ThrowingProvider problema

public interface IConfigurableProvider<T> extends ThrowingProvider<T, ConfigException> {} 

ho più classi che implementa questa interfaccia, per non assumere Ho la seguente:

public class SomethingProvider extends ConfiguredProvider implements IConfigurableProvider<Something> {} 

Di Naturalmente questa classe implementa il metodo necessario:

public Something get() throws ConfigException { /* ... */ } 

Nel mio modulo, ho il seguente codice nel MyModule.java

ThrowingProviderBinder.create(binder()) 
    .bind(IConfigurableProvider.class, Something.class) 
    .to(SomethingProvider.class); 

Ma quando inizio la mia domanda il seguente errore prodotto:

6) No implementation for com.package.Something was bound. 
    while locating com.package.Something 
    for parameter 5 at com.package.OtherClass.<init>(OtherClass.java:78) 
    at com.package.MyModule.configure(MyModule.java:106) 

Io in realtà non so dove devo cominciare a cercare il bug .

Aggiornamento: fornisce lo stesso errore anche se ho impostato l'ambito così:

ThrowingProviderBinder.create(binder()) 
    .bind(IConfigurableProvider.class, Something.class) 
    .to(SomethingProvider.class) 
    .in(Singleton.class); 
+0

Come la risposta accettata ha sottolineato ho frainteso l'uso di 'ThrowingProviderBinder'. Il costruttore iniettato dovrebbe attendere un provider invece dell'oggetto fornito (e dovrebbe esserci l'eccezione controllata gestita). –

risposta

3

Piuttosto che iniettando il Something, è necessario iniettare il IConfigurableProvider<Something>:

public class OtherClass { 
    @Inject 
    public OtherClass(IConfigurableProvider<Something> somethingProvider) { 
    ... 
    } 
} 

Questo è perché è solo nel codice OtherClass (o in qualsiasi codice che utilizza un'istanza di Something) che puoi gestire eccezioni lanciate dal Provider, come ConfigException nel tuo caso.

+0

ma non voglio modificare i costruttori. c'è un modo per ottenere ciò che voglio veramente? –

+1

Penso che dimenticherò il 'ThrowingProvider' e semplicemente userò l'interfaccia' Provider' e avvolgere l'eccezione di origine in 'ProvisionException' –