【发布时间】:2016-02-24 18:21:16
【问题描述】:
我正在做一个由四个部分组成的项目:
-
Main项目将所有内容结合在一起。这包含public static void main(String... args)入口点。 - 组件
A - 组件
B -
A和B都引用的第三方Common组件。
我将 Guice 用于所有四个部分之间的管道,这是我的问题:
在As 和Bs 的主要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),为此我只知道@987654349里面的参数@ 和B。
我尝试通过将A 和B 各自的主要Guice 模块包装在PrivateModules 中来解决整个问题。但是,这失败了,出现下一个错误:
无法为 %s 创建绑定。它已经在一个或多个子注入器或私有模块上配置 %s%n 如果它在 PrivateModule 中,您是否忘记公开绑定? [source]
就我而言,A 和 B 各自的主要 Guice 模块实际上是 ServletModules - 显然我可以从 Main 安装两次。
如何绕过这些错误并安装两次 AbstractCommonPrivateModule 模块?
编辑:我上传了一些示例代码(对一些细节进行了解释)to GitHub
【问题讨论】:
-
这听起来像是一个有趣的问题,但如果没有代码示例,我很难完全理解它。你能发布(或链接一个要点)你到目前为止所尝试的吗?
-
common.SomeClass绑定是什么样的?你也许可以用 Guice 自动为你删除重复数据的方式编写它。 -
我添加了一些code on GitHub。抱歉耽搁了