2011-01-12 5 views
5

나는 다음과 같은 인터페이스가 Guice의 ThrowingProvider 문서에 따르면의Guice ThrowingProvider 문제

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

:

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

을 나는이 인터페이스를 구현하는 여러 클래스를 가지고, 나는 다음과 같은 있다고 가정하자 이 클래스는 필요한 메서드를 구현합니다.

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

내 모듈에서, 나는 MyModule.java

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

에 다음 코드를하지만 내 응용 프로그램을 시작할 때 다음과 같은 오류가 발생 :

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) 

정말 내가 버그를 찾기 시작해야하는 위치 모른다 .

업데이트 : 그것은 나뿐만 아니라 범위를 설정 한 경우에도 동일한 오류 제공 :

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

이 다음 Something를 주입보다 오히려

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

허용 된 답변에서 지적한대로 'ThrowingProviderBinder'의 사용법을 잘못 이해했습니다. 삽입 된 생성자는 제공된 객체 대신 공급자를 기다려야합니다 (처리 된 검사 예외가 있어야 함). –

답변

3

을, 당신은 IConfigurableProvider<Something>을 주입 할 필요가 OtherClass의 코드 (또는 Something의 인스턴스를 사용하는 코드)에만 있기 때문에 제공자가 던진 예외 (예 : 012)를 처리 할 수 ​​있습니다. 귀하의 경우에는입니다.

+0

하지만 생성자를 수정하고 싶지는 않습니다. 내가 원하는 것을 성취 할 수있는 방법이 있습니까? –

+1

''ThrowingProvider'를 잊어 버리고 단순히'Provider' 인터페이스를 사용하고 소스 예외를'ProvisionException'으로 감쌀 것입니다. –