2017-02-10 19 views
1
class ClassA { 
    protected ClassA(Injector baseGraph, 
        BlobStoreContext context, 
        SwiftApi api, 
        @Memoized Supplier<Set<? extends Location>> locations, 
        @Assisted String regionId,PayloadSlicer slicer, 
        @Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) { 
    } 
} 

class ClassB extends ClassA { 
    protected ClassB(Injector baseGraph, 
        BlobStoreContext context, 
        SwiftApi api, 
        @Memoized Supplier<Set<? extends Location>> locations, 
        @Assisted String regionId, 
        PayloadSlicer slicer, 
        @Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) { 
     super(baseGraph, context, api, locations, regionId, slicer, userExecutor); 
    } 

} 

class C extends AbstractModule { 

    protected void configure() { 
     bind(classA).to(classB); 
    } 
} 

あり、コンストラクタの引数でいくつかの問題をAssited。 com.google.inject.CreationException:によって引き起こさGuiceの作成例外 - 結合はありませんバインドは

を取得しています

エラーGuiceの作成エラー:

1)の@ com.googleでアノテートjava.lang.Stringでなし実装。 inject.assistedinject.Assisted(value =)がバインドされました。

+1

なぜあなたは 'ClassB'のコンストラクタで' ClassB'のスーパークラスのコンストラクタを呼び出しますか?これは通常勧告されていません。 –

答えて

0

@Assistedでパラメータ4のため@ com.google.inject.assistedinject.Assisted(値=) で注釈java.lang.Stringで位置決めそのGuiceの特徴である、assisted injectionの文脈で使用されている間通常のコンストラクタパラメータとGuice提供のパラメータ注入を混在させたファクトリを自動的に実装します。ここで例えば、の場合:

public interface ClassBFactory { 
    ClassB create(String regionId); 
} 

あなたは、このようなあなたのAbstractModuleサブクラスにバインドします:私は、このインターフェイスを見ることを期待する

class ClassB extends ClassA { 
    protected ClassB(Injector baseGraph, 
        BlobStoreContext context, 
        SwiftApi api, 
        @Memoized Supplier<Set<? extends Location>> locations, 
        @Assisted String regionId, 
        PayloadSlicer slicer, 
        @Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) { 
     super(baseGraph, context, api, locations, regionId, slicer, userExecutor); 
    } 

} 

install(new FactoryModuleBuilder().build(ClassBFactory.class)); 

Guiceには、検査することができますClassBFactoryインターフェイスでClassBの戻り値を確認し、String regionIdのパラメータをcreateと一致させると、@Assisted String regionIdのパラメータに一致しますこのコンストラクターのインスタンスを作成し、このClassBFactoryインスタンスをグラフに追加します。その時点で、ClassBを注入するのではなく、ClassBFactoryを注入してclassBFactory.create("foo")と呼んでClassBを作成し、regionId"foo"に設定します。あなたはClassBではなくClassBFactoryを注入しようとした場合

しかし、Guiceのは、あなたの@Assisted注釈に特別な治療を与えることはありませんし、そのフィールドを注入することができません。コードベースを検索してファクトリインタフェースが存在するかどうか調べ、存在しない場合は、ファクトリインタフェースを作成する(またはコンストラクタを再設計する)必要があります。

関連する問題