【发布时间】:2016-07-13 23:11:07
【问题描述】:
我是 Guice 的新手。我将 Guice 与 AWS SWF 结合使用。我目前的结构如下:
主类:
class MainClass {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new ClientModule(param1, param2));
injector = injector.createChildInjector(injector.getInstance(TestModule.class));
}
}
测试模块:
class TestModule extends AbstractModule {
@override
protected void configure() {
// create SWF service object
// Register Workflow worker and Activity worker
TempWorkflowClientExternalFactory fac = TempClientExternalFactoryImpl(swf_service, domain);
bind(TempWorkflowClientExternalFactory.class).annotatedWith(Names.named("ABC")).toInstance(fac);
}
}
我想使用它的类的定义:
class Test {
@Inject
@Named("ABC")
TempWorkflowClientExternalFactoryImpl fac;
public void method() {
TempWorkflowClientExternal temp = fac.getClient("123");
temp.callWorkflowMethod() // This method is defined in SWF Workflow Activity class
}
}
但是在执行时出现以下错误:
No implementation for <packageName>.TempWorkflowClientExternalFactoryImpl annotated with @com.google.inject.name.Named(value=ABC) was bound
无论在何处注入 TempWorkflowClientExternalFactory,我都需要返回相同的对象。 我试着查看 Guice wiki/FAQ。不幸的是,我认为我忽略了某些东西或误解了某些概念。
如果我在创建fac 对象后在configure 方法中使用以下代码而不是绑定,我的应用程序将按预期工作。
TempWorkflowClientExternal temp = fac.getClient("123");
temp.callWorkflowMethod()
但是,当我尝试绑定时,它失败了。
更新:
如果我在没有annotatedWith 的情况下执行绑定,程序会执行,但我可以观察到绑定没有正确完成,因为Test 类中的fac 对象被实例化为默认构造函数,而不是我想要关联的对象
其他详细信息:TempWorkflowClientExternalFactoryImpl、TempWorkflowClientExternalFactory、TempWorkflowClientExternal 也是 AWS-SWF 自动生成的类。我无法修改它们的构造函数或在这些类中添加任何注释。 Test.method() 将在满足某些业务逻辑条件时调用。
有人可以帮忙解决这个错误吗?
【问题讨论】:
-
如何构造
Injector?您的TestModule是否实际安装在喷油器中?如果你能提供一个minimal reproducible example 会有所帮助。 -
是的,我已经在注射器中安装了 TestModule。由于代码包含使用凭证与 AWS SWF 的连接,因此我无法发布完整的示例。我已经用表示相同的注释替换了连接代码。其他一切都与代码中的一样。我还更新了最后的问题,其中提到了我要绑定的自动生成的类。
标签: java dependency-injection annotations guice