原因是我两次调用common.abstractCommonModule.configure()
;一次是从组件a
的com.a.mainmodule.configure()
安装Common.AbstractCommonPrivateModule
的子类实例,另一次是从组件B
的com.b.mainmodule.configure()
安装Common.AbstractCommonPrivateModule
的子类实例。
在main
中只安装一个Common.AbstractCommonPrivateModule
实例是不可取的,因为AbstractCommonPrivateModule
实现了一个特定的绑定器方法BindComplecatedStuff(ComplecatedStuff)
,对于该方法,我只知道a
和B
中的参数。
我试图通过将A
和B
各自的主要Guice模块包装在PrivateModule
中来解决这一问题。但是,此操作失败,出现下一个错误:
无法为%s创建绑定。它已经配置在一个或多个子注入器或私有模块上%s%n如果它在PrivateModule中,是否忘记公开绑定?“出处”
在我的例子中,A
和B
各自的主要Guice模块实际上是ServletModule
-显然我可以从main
安装两次。
编辑:我上传了一些示例代码(带有关于一些细节的解释)到GitHub
与其让A
和B
安装common
,不如让它们使用requireBinding()
,以获得它们从common
中需要的类。则依赖于A
或B
的模块也需要安装common
。这可能感觉有点奇怪,但实际上是可取的,因为a
和B
现在与common
的耦合不那么紧密。
更新
我安装两个ShiroWebModule
的原因是,我希望UI
模块中的Jersey资源仅使用一个Shiro配置(一个取消密码保护资源的配置)来保护,而API
模块中的所有Jersey资源应使用一个完全不同的Shiro配置(一个仅将承载令牌理解为身份验证机制的配置)来保护。
当然,有很多解决方案,具体取决于您的需求。最常见的方法是使用绑定注释,并让UI和API代码请求不同的注释。这样,您就可以安装同一个接口或类的两个不同实现(带有不同的注释)。
这里有一个例子:
package api;
public class ApiResources {
@Inject
public ApiResources(@ApiAuthMechanism AuthMechanism auth) {
this.auth = auth;
}
}
---
package api;
public class ApiModule implements Module {
public void configure() {
bind(AuthMechanism.class).annotatedWith(ApiAuthMechanism.class)
.to(BearerTokenAuthMechanism.class);
}
}
---
package ui;
public class UiResources {
@Inject
public UiResources(@UiAuthMechanism AuthMechanism auth) {
this.auth = auth;
}
}
---
package ui;
public class UiModule implements Module {
public void configure() {
bind(AuthMechanism.class).annotatedWith(UiAuthMechanism.class)
.to(PasswordAuthMechanism.class);
}
}
---
package webap;
public class WebappModule implements Module {
public void configure() {
// These modules can be installed together,
// because they don't install overlapping bindings
install(new ApiModule());
install(new UiModule());
}
}
您在注释中提到,您无法控制正在安装的重叠绑定,因为它们来自第三方模块。如果是这种情况(我没有看到在代码中发生了这种情况),出于安全原因,第三方可能不希望您执行您想要执行的操作。例如,简单地绑定基于密码的机制可能会在整个应用程序中引入漏洞。也许值得尝试更好地理解第三方打算如何使用其模块。
Plagiarize, plagiarize, plagiarize / Only be sure always to call it, please research. Lobachevsky — Tom Lehrer 如果你对自己编制的代码有疑问,使用他人的吧。在许多情况下, 当你要写一个 Puppet 模块来管理一些软件或服务时,不必从头开始编写。 对许多流行的应用程序,在 Puppet F
让我们创建一个名为的新模块,并在那里定义CounterService。 app/shared/shared.module.ts 现在我们将引入 SharedModule 到AppModule 和中。 app/lazy/lazy.module.ts 使用此配置,两个模块的组件都可以访问CounterService。 我们将以完全相同的方式在EagerComponent和LazyComponent中使
问题内容: 在其中,您可以选择覆盖依赖项,并使其指向其他存储库,例如在以下https://github.com/kubermatic/glog- logrus 库中,您需要在Gopkg.toml文件中添加以下几行: 然后在代码库中。但是,在go模块中,我看不到这样的选择吗?这使我认为唯一的解决方案是将import更改为。 谢谢! 问题答案: 这就是指令的目的。 引用Wiki Go 1.11模块:我
Velocity 不依赖 jQuery Velocity.js 可以在不引入 jQuery 的情况下单独使用。如果 你需要大部分动画效果能兼容 IE8,就必须引入 jQuery 1×。 它也可以和 Zepto 一起使用,写法和 jQuery 一样: // 无 jQuery 或 Zepto 时,Velocity()方法挂载在 window 对象上 (window.velocity) // ( 第一
在使用Maven一段时间后,我对Maven在构建体系结构中带来的许多特性感到兴奋,尤其是依赖项管理。然而,我一次又一次地遇到了一个问题--Maven如何解决多模块项目之间的依赖关系。我想知道这是否是当前Maven实现的大缺陷和/或是否有任何令人满意的解决方案。 假设我有一个多模块的Maven项目。父pom包含三个模块--moduleA(jar)、moduleB(jar)和moduleC(war)。
我有一个小小的两难问题,涉及到Guice和避免非Guice单例。考虑一个多模块项目,其中有3个模块:、和。和都使用模块内的类的实例(该模块是times方法,并在整个项目中广泛使用)。 几乎每个类都需要使用这个实例(包括在用户连接时动态创建的对象)。 如果每个类都需要类的一个实例,那么不同的方法都有缺点: 解决方案2(仅作为实例字段): 缺点:与上面类似,您必须使用Guice的来实例化每个对象。这意