1

コンストラクターでいくつかのパラメーターを渡しながら、いくつかのクラスを注入しようとしています。それを達成するために、この質問 ( 12 )を見つけました。これは、ファクトリでアシスト インジェクションを使用することで達成できると言っています。これは、提供された例と関連ドキュメントを読んだ後のいくつかの変更に従って、私のコードがどのように見えるかです。

グラドルスクリプト

dependencies { 
    compile 'org.roboguice:roboguice:3.+'
    provided 'org.roboguice:roboblender:3.+'
    compile 'com.google.inject.extensions:guice-assistedinject:3.+' 
}

パラメータを受け取る create メソッドを含むファクトリ インターフェイス

public interface ICustomObjectFactory {
    ICustomObject create(Callback callback);
}

インターフェイスを実装するクラス

public class CustomObject implements ICustomObject {
    protected String name;

    @AssistedInject
    public CustomObject(@Assisted Callback callback){
       this.callback = callback;
    }
}

Aplication クラスから使用および呼び出されるモジュール

public class SomeModule extends Module {

    @Override
    protected void configure() {
         install(new FactoryModuleBuilder()
            .implement(ICustomObject.class, CustomObject.class)
            .build(ICustomObjectFactory.class));
    }
}

Application クラスから登録されたインジェクション モジュール

@Override
public void onCreate() {
    super.onCreate();

    RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
            RoboGuice.newDefaultRoboModule(this), new SomeModule(this));
}

工場の利用

public class SomeClass implements Callback {

    @Inject ICustomObjectFactory factory;

    public SomeClass () {
        ICustomObject first = this.factory.create(this);
    }
}

このようなすべてで、ファクトリを使用しようとすると、このエラーが発生します。SomeClass

java.lang.IllegalStateException: Factories.create() factories cannot be used until they're initialized by Guice.
        at com.google.inject.internal.util.$Preconditions.checkState(Preconditions.java:142)
        at com.google.inject.assistedinject.FactoryProvider2.getBindingFromNewInjector(FactoryProvider2.java:564)
        at com.google.inject.assistedinject.FactoryProvider2.invoke(FactoryProvider2.java:625)
        at java.lang.reflect.Proxy.invoke(Proxy.java:397)
        at $Proxy12.create(Unknown Source)

Factoryが初期化されていない理由を誰かが知っていますか? モジュールによって初期化する必要があることを理解しており、それが呼び出されたモジュールであると確信しています。

私のコードとリンクされた質問のコードとの最も顕著な違いは、質問では、コンストラクターに@Injectではなくで注釈が付けられていること@AssistedInjectです。この変更の前は、アプリのコンパイル中にこのエラーが発生していました。

エラー: タスク ':app:compileDebugJavaWithJavac' の実行に失敗しました。java.lang.ClassCastException: com.sun.tools.javac.code.Type を javax.lang.model.type.DeclaredType にキャストできません ドルの依存キャッシュが破損している可能性があります (これは、ネットワーク接続のタイムアウト後に発生することがあります)。依存関係と同期プロジェクト (ネットワークが必要)

  • Gradle ビルド プロセス (デーモン) の状態が破損している可能性があります。すべての Gradle デーモンを停止すると、この問題が解決する場合があります。Gradle ビルド プロセスを停止します (再起動が必要です)
  • プロジェクトで、プロジェクト内の他のプラグインまたはプロジェクトが要求する Gradle のバージョンと互換性のないサードパーティのプラグインを使用している可能性があります。
  • Gradle プロセスが破損している場合は、IDE を閉じてからすべての Java プロセスを強制終了することもできます。

    たぶん、これは私が必要とするものを達成するための最良のアプローチではありません. そうでない場合、誰かが私に正しい方向を向けることができますか?

    ご協力ありがとうございました

    4

    2 に答える 2

    0

    AssistedInjectRoboguice 3 以降ではサポートされていませ

    を無効にして動作させることができてうれしいですAnnotationsDatabase。以前のエラー:

    com.sun.tools.javac.code.Type cannot be cast to javax.lang.model.type.DeclaredType
    

    @Inject署名にプリミティブ型を持つコンストラクターでの使用から発生していました。この回答を参照してください

    を使用できるようにする簡単な解決策は、 とは異なり、Roboguice 3+ でサポートされてAnnotationsDatabaseいる を使用することです。したがって、モジュールでは次のようになります。Provider<T>AssistedInject

    binder.bind(CustomObject.class).toProvider(CustomObjectProvider.class);
    

    Provider次に、次のように挿入します。

    public class CustomObjectProvider implements Provider<CustomObject> {
    
        Callback callback;
    
        @Inject
        public CustomObjectProvider(Callback callback) {
            this.callback = callback;
        }
    
        @Override
        public CustomObject get() {
            return new CustomObject(callback);
        }
    }
    
    于 2016-08-04T00:49:55.303 に答える