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

如何使用安装公共依赖项模块的两个Guice模块

马庆
2023-03-14
    null

原因是我两次调用common.abstractCommonModule.configure();一次是从组件acom.a.mainmodule.configure()安装Common.AbstractCommonPrivateModule的子类实例,另一次是从组件Bcom.b.mainmodule.configure()安装Common.AbstractCommonPrivateModule的子类实例。

main中只安装一个Common.AbstractCommonPrivateModule实例是不可取的,因为AbstractCommonPrivateModule实现了一个特定的绑定器方法BindComplecatedStuff(ComplecatedStuff),对于该方法,我只知道aB中的参数。

我试图通过将AB各自的主要Guice模块包装在PrivateModule中来解决这一问题。但是,此操作失败,出现下一个错误:

无法为%s创建绑定。它已经配置在一个或多个子注入器或私有模块上%s%n如果它在PrivateModule中,是否忘记公开绑定?“出处”

在我的例子中,AB各自的主要Guice模块实际上是ServletModule-显然我可以从main安装两次。

编辑:我上传了一些示例代码(带有关于一些细节的解释)到GitHub

共有1个答案

葛玉堂
2023-03-14

与其让AB安装common,不如让它们使用requireBinding(),以获得它们从common中需要的类。则依赖于AB的模块也需要安装common。这可能感觉有点奇怪,但实际上是可取的,因为aB现在与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的来实例化每个对象。这意