我正在开发一个由四个部分组成的项目:
Main
项目将所有内容汇集在一起。其中包含public static void main(String... args)
入口点。- 组件
A
- 组件
B
- 第三方
Common
组件,A
和B
都引用它。
我使用 Guice 在这四个部分之间进行连接,而我的问题是:
在 A
和 B
的主要 Guice 模块中,我安装了一个扩展了 Common
中定义的模块的模块。在运行时,此设置会失败,并显示以下错误:
这是因为我两次调用了绑定到
common.SomeClass
已在common.AbstractCommonModule.configure()
中配置。 [source]
common.AbstractCommonModule.configure()
;一次是通过从组件A
的com.a.MainModule.configure()
安装common.AbstractCommonPrivateModule
的子类实例,另一次是通过从组件B
的com.b.MainModule.configure()
安装。
仅在Main
中安装一个common.AbstractCommonPrivateModule
不是一个选项,因为AbstractCommonPrivateModule
实现了一个特定的绑定器方法bindComplicatedStuff(ComplicatedStuff)
,我只知道在A
和B
内分别使用哪个参数。
我尝试通过将A
和B
各自的主Guice模块包装在PrivateModule
中来解决这整个问题。然而,这导致了下一个错误:
无法为%s创建绑定。它已经配置在一个或多个子注入器或私有模块%s上了。如果它在PrivateModule中,请确认是否忘记暴露该绑定?[source]
在我的情况下,A
和B
各自的主要Guice模块实际上是ServletModule
- 看起来我可以从Main
安装两次。
如何解决这些错误并安装AbstractCommonPrivateModule
模块两次?
编辑:我上传了一些示例代码(包括一些详细说明)到GitHub
common.SomeClass
绑定是什么样子的?你可以尝试以一种方式编写它,让 Guice 自动帮你去重。 - Tavian Barnes