2011-01-12 9 views
5

De acuerdo con la documentación ThrowingProvider de Guice tengo la siguiente interfaz:Guice ThrowingProvider problema

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

tengo varias clases que implementan esta interfaz, y mucho suponer Tengo el siguiente:

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

De Por supuesto, esta clase implementa el método necesario:

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

En mi módulo, tengo el siguiente código en MyModule.java

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

Pero cuando comienzo mi solicitud produjo el siguiente error:

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) 

Realmente no sé por dónde debería empezar a buscar el error .

actualización: Proporciona el mismo error incluso si fijo el alcance así:

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

Como la respuesta aceptada señaló, no entendí el uso de 'ThrowingProviderBinder'. El constructor inyectado debe esperar a un proveedor en lugar del objeto proporcionado (y debe haber una excepción controlada manejada). –

Respuesta

3

En lugar de inyectar el Something, es necesario inyectar el IConfigurableProvider<Something>:

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

Este es porque solo está en el código OtherClass (o en cualquier código que use una instancia de Something) puede tratar con excepciones lanzadas por el proveedor, como ConfigException en su caso.

+0

pero no quiero modificar los constructores. ¿Hay alguna manera de lograr lo que realmente quiero? –

+1

Creo que me olvidaré del 'LanzadorProveedor' y simplemente usaré la interfaz' Proveedor' y ajustaré la excepción fuente en 'ProvisionException' –