【问题标题】:Android assisted injection with Factory using Roboguice not working使用 Roboguice 使用 Factory 进行 Android 辅助注入不起作用
【发布时间】:2016-09-14 14:44:32
【问题描述】:

我试图注入一些类,同时在构造函数中传递一些参数。为了实现这一点,我发现这个问题(12)说这可以通过使用工厂辅助注射来实现。这就是我的代码的样子,按照提供的示例和阅读相关文档后的一些修改。

gradle 脚本

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;
    }
}

从应用程序类中使用和调用的模块

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)

有人知道为什么工厂没有初始化吗?我知道应该由模块初始化,并且我确定它被调用的模块。

我的代码与链接问题中的代码之间最显着的区别在于,在问题中,构造函数被注释为@Inject,而不是@AssistedInject。在此修改之前,我在编译应用程序时遇到此错误。

错误:任务 ':app:compileDebugJavaWithJavac' 执行失败。 java.lang.ClassCastException:com.sun.tools.javac.code.Type 无法转换为 javax.lang.model.type.DeclaredType dle 的依赖缓存可能已损坏(这有时会在网络连接超时后发生。) 重新下载依赖并同步项目(需要网络)

  • Gradle 构建过程(守护程序)的状态可能已损坏。停止所有 Gradle 守护程序可能会解决此问题。 停止 Gradle 构建过程(需要重新启动)
  • 您的项目可能使用了与项目中其他插件或项目请求的 Gradle 版本不兼容的第三方插件。
  • 如果 Gradle 进程损坏,您也可以尝试关闭 IDE,然后终止所有 Java 进程。

    也许这不是实现我需要的最佳方法。如果不是,有人可以指出正确的方向吗?

    谢谢大家的帮助

    【问题讨论】:

      标签: java android dependency-injection roboguice assisted-inject


      【解决方案1】:

      AssistedInjectnot supported for Roboguice 3+

      很高兴您可以通过禁用 AnnotationsDatabase 来使其正常工作。您之前的错误:

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

      是由于在签名中具有原始类型的构造函数上使用 @Inject 而发生的。见this answer

      应该允许您使用AnnotationsDatabase 的简单解决方案是使用Provider<T>,与AssistedInject 不同,Roboguice 3+ 支持。所以,在模块中:

      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);
          }
      }
      

      【讨论】:

        【解决方案2】:

        最后,我通过在 Application 类中添加 RoboGuice.setUseAnnotationDatabases(false) 使其工作:

        @Override
        public void onCreate() {
            super.onCreate();
        
            RoboGuice.setUseAnnotationDatabases(false);
            RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
                    RoboGuice.newDefaultRoboModule(this), new SomeModule(this));
        }
        

        【讨论】:

          猜你喜欢
          • 2012-04-18
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          • 1970-01-01
          • 2020-11-01
          • 2014-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多