当前位置: 首页 > 知识库问答 >
问题:

使用Roboguice的工厂的Android辅助注射不工作

殷功
2023-03-14

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

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

从应用程序类注册的注入模块

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

有了这样的一切,当我尝试使用工厂时,我遇到了这个错误,因为它已经在某事类中使用过了

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 的依赖缓存可能已损坏(这有时会在网络连接超时后发生)。重新下载依赖项并同步项目(需要网络)

也许这不是实现我需要的最好方法。如果不是,有人能告诉我正确的方向吗?

谢谢大家的帮助

共有2个答案

焦苏燕
2023-03-14

AssistedInject 在 Roboguice 3 中不受支持

我很高兴你可以让它在禁用注释数据库的情况下工作。您之前的错误:

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

是在签名中具有基元类型的构造函数上使用@Inject时发生的。查看此答案

允许您使用< code>AnnotationsDatabase的一个简单解决方案是使用< code>Provider

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

然后注入提供程序,如下所示:

public class CustomObjectProvider implements Provider<CustomObject> {

    Callback callback;

    @Inject
    public CustomObjectProvider(Callback callback) {
        this.callback = callback;
    }

    @Override
    public CustomObject get() {
        return new CustomObject(callback);
    }
}
涂羽
2023-03-14

最后,我通过添加<code>RoboGuice来实现它。应用程序类中的setUseAnnotationDatabases(false):

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

    RoboGuice.setUseAnnotationDatabases(false);
    RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
            RoboGuice.newDefaultRoboModule(this), new SomeModule(this));
}
 类似资料:
  • 我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。

  • 我是一名guice新手,试图弄清楚如何使用FactoryModuleBuilder在guice中实现辅助注入。我参考了guice java文档来实现FactoryModuleBuilder。 我所做的一切都完全按照文件中所说的那样。这不是注射工厂。我提到了这个堆栈溢出问题:Guice AssistedInject不会注入具有相同问题的工厂。它讨论了构造函数注入之前的字段注入问题。我遵循了它,并尝试

  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

  • 假设有一个类A,它的构造函数是这样的: 还有AFactory: 所以要创建一个A的实例,我显然需要做这样的事情: 但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor): 我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。 正确的做法是什么?我就是想不出一个干净的方法来做到这一点。

  • 我是Guice的新手,所以我试图理解AssistedInject。我有一个非常简单的项目: 我要注入的类: 带辅助注射的类别: 工厂 主类: 但它仍然不起作用,我不明白,我错在哪里?

  • 我有这个接口和简单的实现: 我想使用Guice用不同的方法生成一个。