2011-08-13 25 views
2

このエラーとそれを解決する方法を理解するには、何か助けが必要です。Guice CreationException - Foo型の実装がバインドされていません

だから私はこのような種類があります:fooは、注射にするために

class Foo { 
    static final class Bar {} 

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

を、私は、今私が 実装を入力して提供するために、何の問題もない、 のparams AおよびBの依存関係を満たすために必要がありますそのヌルではないので、私は パッケージのModuleクラスに@Providesメソッドを持っています。しかし、bについてはどうですか?そのnullable、書く方法 @ nullable可能なパラメータを提供しますか? java.util.Set<Foo$Bar>用ませ実装がバインドされなかった

1):私の推測では、それは が要求されるべきではないですし、Guiceには注釈を理解する必要があります... しかし、何かが右に動作していない、私はこのエラーを得ました。

そしてここ@Provides方法である(ATM動作しませんでした)

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

私は、ネストされたクラスがパブリックでもコンストラクタではありません知っているので、多分 のGuiceはそれにアクセスすることはできませんが、たとえ私はそれらをすべて公開する(私は が本当に望んでいない)エラーはまだ残っている...私は何かがあります がありますか?

+1

ヌルコレクションが本当に必要ですか?空のセットを使用できますか? –

+0

実際はそうではありませんが、オリジナルの考えでは、クライアントがSetオブジェクトを提供する必要はありません(クライアントが本当に気にしなくても空のSetを構築してください)、Fooコンストラクタはnullをチェックし、私はFoo(TypeA a)を追加して@ Nullableを削除するだけでコンストラクタをオーバーロードすることができることを知っています。多分私はそれについて考えるべきです。 – jimx

答えて

0

Set<Bar>のバインディングを持たず、Set<Bar>のバインディングがあるのは、nullです。

あなたはFooのコンストラクタに二番目のパラメータを提供することができるようにするためにSet<Bar>(つまりnullでもよい)またはbind(Bar.class).toProvider(Providers.ofInstance(null))のようなものを返す@Provides方法を必要とするでしょう。

Foo@Providesメソッドは、@Inject注釈付きコンストラクタを直接呼び出しているだけなので、まったく必要ではありません。また、nullではなく、空のSet<Bar>にバインドすることをお勧めします。

+1

あなたの提案にしたがって、このコードをこのようなものにリファクタリングする必要があります(Stas Kurilinからの素直な返答によって暗示されるようです)。 2つのコンストラクタ、Foo(TypeA a)、Foo(TypeA a、Set b)を挿入し、最初に? – jimx

関連する問題