2011-08-13 2 views
2

이 오류와 가능한 해결 방법을 이해하려면 도움이 필요합니다.Guice CreationException - Foo 유형의 구현이 바인딩되지 않았습니다.

그래서 나는이 같은 유형이 있습니다 푸 주사하게하기 위해

class Foo { 
    static final class Bar {} 

    @Inject 
    Foo(TypeA a, @Nullable Set<Bar> b) {} 
} 

, 나는 PARAMS A와 B에 대한 의존성을 이행 할 필요를, 지금은, 입력 한 구현을 제공 할 문제가 없습니다 null이 아니므로 패키지 Module 클래스에 @Provides 메서드가 있습니다. 그러나 b는 어떨까요? 그 nullable, 쓸 방법 @ nullable 수있는 매개 변수를 제공합니까?

1) java.util.Set<Foo$Bar>에 대한 어떠한 구현이 결합되지 않은 : 내 생각 엔이 이 필요하지 말아야하고 Guice는 주석 ... 을 이해해야하지만 뭔가 잘 작동하지 않는 경우,이 오류가 발생했습니다. 여기

그리고는 어쩌면 guice가 있지만 경우에도 액세스 할 수 없습니다 (ATM 작동하지 않았다)이 @Provides 방법

@Provides @Nullable 
public Foo provideFoo(TypeA a, @Nullable Set<Foo.Bar> b) { 
    return new Foo(a, b); 
} 

내가 중첩 된 클래스가 공개 아니라는 것을 알고 나 생성자 나는 그 (것)들을 모두 공중에게 만든다 (어느 것이 나 진짜로 원하지 않는다) 아직도 과실은 ... 남아있다 무언가가 있는가 없는가?

+1

null-collection이 필요합니까? 빈 세트를 사용할 수 있습니까? –

+0

실제로는 아니지만 원래 생각은 클라이언트가 Set 객체를 제공하도록 클라이언트를 요구하지 않는 것입니다 (클라이언트가 실제로 신경 쓰지 않는 경우에도 빈 세트를 생성합니다). Foo 생성자는 null을 확인하고 필요한 경우 빈 세트를 만듭니다. Foo (TypeA a)를 추가하고 @ Nullable을 제거하여 생성자를 오버로드 할 수 있음을 알고 있습니다. 아마 그것에 대해 생각해야합니다. – jimx

답변

0

Set<Bar>에 바인딩이없고 Set<Bar>에 대한 바인딩이 null 인 경우에는 차이가 있습니다.

당신은 Foo의 생성자에 두 번째 매개 변수를 제공 할 수 있도록하기 위해 bind(Bar.class).toProvider(Providers.ofInstance(null)) 같은 Set<Bar> (즉 null 수 있음) 또는 뭔가를 반환하는 @Provides 방법이 필요한 것입니다.

@ProvidesFoo의 메소드는 @Inject 주석 생성자를 직접 호출하기 때문에 전혀 필요하지 않습니다. 또한 null이 아닌 빈 Set<Bar>에 바인드하는 것이 좋을 것이라고 말하고 싶습니다.

+1

제안대로,이 코드 조각을 (Stas Kurilin의 평범한 응답에 의해 암시 된 것처럼)이 코드 조각을 리펙토링해야합니까? 두 개의 생성자, Foo (TypeA a) 및 Foo (TypeA a, Set b)를 삽입 한 다음 첫 번째? – jimx

관련 문제