问题标签 [guice-3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
501 浏览

java - 如何使用 Guice 的 AssistedInject 工厂和服务加载器?

在我的 guice 模块中,我有多个工厂,如下所示:

这两个工厂都有以下 create 方法,该方法采用辅助元素:

在 CarChooser 类中,我得到了 Ferrari 或 Mercedes 的实例,如下所示:

在同一个班:

现在,我正在尝试使这个 CarChooser 类对扩展开放但对修改关闭。即如果我需要添加另一个工厂,我不应该将它声明为变量+将它添加到构造函数+为相应的新类型添加另一个if子句。我打算在这里使用 ServiceLoader 并声明一个接口 CarFactory 将由所有工厂(例如 FerrariFactory、MercedesFactory 等)实现,并且所有实现都将具有 getCarType 方法。但是如何使用 Service Loader 调用 create 方法?

如果可行的话是正确的方法(我什至不确定这是否可行)。或者有没有更好的方法来做同样的事情?

感谢帖子的第一条评论,我知道我想使用 MapBinder 。我写了一个由 FerrariFactory 和 MercedesFactory 扩展的 CarFactory。所以我添加以下内容:

但由于上述代码的 .to 部分是抽象类,我得到一个初始化错误,即 FerrariFactory 未绑定到任何实现。我应该在这里将它绑定到使用 FactoryModuleBuilder 声明的正确 Assisted Inject Factory 吗?

0 投票
0 回答
501 浏览

java - 在运行时获取过滤器顺序

我正在使用 Tomcat,但我想采用通用方式(servlet 3.0)

我在 web.xml 中有一些配置的过滤器,其中之一是 GuiceFilter。GuiceFilter 有点欺负人......一旦它被执行,它将吞下请求并且永远不会调用正在进行的过滤器。这样我就无法在 Guice 之后执行任何过滤器。我可以在 web.xml 的 guice insetead 中定义所有过滤器,但这不适用于某些过滤器:“Tomcat WebSocket (JSR356) Filter”这是一个过滤器 Tomcat 将在所有其他过滤器之后注册以处理 WebSockets...它应该是第一个,不是最后一个,但我只需要在 GuiceFilter 之前或在其中执行它。

我找到了一种获取所有已注册过滤器并将它们添加到 guice 的方法:

但这样我会得到一些过滤器(Guice 之前的一个)执行两次(普通过滤器链和 guice 一个)

有没有办法获得过滤器订单?(所以我只能在 guice 之后添加那些)

或者,另一种方式:有没有办法从正常链中删除过滤器,只留下 guice 一个(将所有其他过滤器移动到 guice 本身)?

0 投票
1 回答
761 浏览

scala - 将 WebService 与 Akka Actors 和 play 框架一起使用

我已经使用 Play 和 Akka 构建了一个 Web 服务,现在需要集成另一个 Web 服务,我的 Web 服务是一个客户端。

我的默认控制器(带有关联的路由文件)看起来像

这启动了一个大型演员系统,一切都很好。

其中一名演员的定义如下 -

我的问题是我现在需要从这个演员那里调用一个新的网络服务。此 Web 服务是一个数据库,将记录此参与者的结果。

我已经看到并遵循了(除其他外)的指示

  1. https://playframework.com/documentation/2.5.x/ScalaWS
  2. Play Framework 2.5 中抽象类和对象的依赖注入

按照上面的说明,我应该将 WSClient 注入到我需要访问它的类中。

我能够解决依赖注入到第二个控制器中,如下所示

这可行,我可以通过访问路由文件中映射到的 URL 来执行“发布”操作,从而访问 Web 服务。我现在也有两个控制器。

我的问题是从 ActorMgr(一个 Akka Actor)访问 Web 服务控制器“post”方法。我该如何启用它?

0 投票
2 回答
6742 浏览

java - 在 AWS Lambda 中集成 Google Guice

我正在尝试将 Google Guice 集成到 AWS Lambda 中,但由于某些原因,注入效果不佳。每当我尝试打电话时,它都会给我 null

处理程序代码:

用户服务

用户服务实现

绑定类:

测试类:

由于某些原因,UserService userService 在 FirstLamdba 中设置为 null。

任何想法?

0 投票
1 回答
1584 浏览

java - Guice - 绑定由辅助注入工厂创建的实例

假设有一个类 A 的构造函数看起来像这样:

还有AFactory:

因此,要创建一个 AI 实例显然需要执行以下操作:

但是,假设我有其他类:B 类、C 类和 D 类具有类型 A 的成员,例如(具有字段注入但也可以是 ctor):

我希望将相同的 A 实例注入到这些类中。但是仍然可以选择将 A 的另一个实例注入其他类(比如说 E 类和 F 类)。

这样做的正确方法是什么?我只是想不出一个干净的方法来做到这一点。

0 投票
0 回答
171 浏览

dependency-injection - Guice 3.0 默认提供者实现

我一直在项目中使用 Guice,我试图了解默认注入的提供程序是如何工作的。在手册的“注入提供者”部分 ( https://github.com/google/guice/wiki/InjectingProviders ) 有以下简单示例:

现在,我想知道的是 processorProvider.get() 和 transactionLogProvider.get() 的默认实现究竟做了什么。

例如:

  • 始终创建 CreditCardProcessor/TransactionLog 的新实例
  • 使用对象池
  • 别的东西。。

我之所以问这个问题是因为我目前在我的项目中遇到了一些奇怪的行为,如果默认提供程序使用某种缓存策略,这可能会得到解释。

谢谢

0 投票
0 回答
235 浏览

java - Serenity 跨平台统一解决方案

我正在尝试使现有的解决方案可以在任何平台上运行。制作扩展 DriverSource 类的自定义驱动程序很容易,但我仍然必须解决不同的页面对象注入(例如在移动设备上运行具有不同的布局)。为此,我想使用 Google Guice

我将分享一个没有 DI 的解决方案,它工作正常,但应该有更好的方法。

(您也可以使用抽象类而不是接口,因为移动设备和桌面设备的大多数方法可能相同)

以及接口的两种实现:

AbstractSteps 将根据 Cmd 中给出的系统属性来决定实现

EndUserStep 将扩展 AbstractSteps 并使用方法

和一个基本的测试:

我使用以下命令运行测试:

mvn test -Dtest=SearchByKeywordStory -Dwebdriver.driver=provided -DrunPlatform=mobile -DrunEnv=staging-env verify,其中提供的是移动设备的自定义驱动程序:

在 serenity.properties

完成,它工作!

但正如我之前所说,我想尝试使用 Guice 完成这项工作,但我遇到了问题,因为 Serenity 使用 Google Guice 实例化驱动程序和步骤。

页面接口和页面实现保持不变。

步骤:

我创建了一个 BaseTest,其中创建了 injecor(这可以通过不同的方式完成) 完成绑定的模块 -bind(GooglePageInterface.class).to(GoogleDesktopPage.class)- 可以在不同的类中

和测试:

测试开始,但驱动程序未传递给 GoogleDesktopPage.class,因此测试失败,但该类被注入,因为来自 navigateToHomePage() 的消息“您在 GoogleDesktopPage”被打印出来

我知道 Serenity 使用注释注入 webdriver 和步骤,我有点卡在这里

如果有人能以某种方式帮助我完成这项工作,我将不胜感激(可能是与 DI 不同的方法,因为这似乎不是一个好方法)

0 投票
1 回答
804 浏览

java - 在 Guice 中,如何创建具有不同范围依赖的 Map Binder 单例绑定?

以下地图活页夹绑定给了我一个 com.google.inject.OutOfScopeException: Not in MyScope:

我猜这可能是因为法拉利的构造函数依赖于一个用@MyScope 注释的对象。在这种情况下如何创建法拉利单例?

我知道(如何从不同范围创建对象)要创建不同范围的对象,我们需要提供者。如果是这种情况,我应该在 FerrariProvider 的 get 方法中写什么,以便它总是返回同一个 Ferrari 实例?我有什么方法可以创建一个依赖于不同范围内对象的法拉利单例?

0 投票
0 回答
89 浏览

dependency-injection - 有没有办法将自定义绑定播种到 Guice 中已经创建的注入器?

我使用 Guice.create(modules) 创建了 Injector 实例。创建注入器后,我想动态添加一些绑定,有可能吗?

0 投票
2 回答
468 浏览

java - Guice @annotations approach similar to Guice MapBinder approach

I am new to Guice DI. And I would like to get my scenario clarified.

To put it simple, Is there any replacement of MapBinder through Guice @annotations?

My Scenario:

I would like to Inject the implementation class of A as follows,

I understand that the above could be done with MapBinder, but I would like to do it through annotations as follows,

So making the class annotated with params could automatically picks and inject the class based on the parameter (One or Two).

Since @Inject cannot accept params, overriding @Inject would help in this scenario? if so, how do we do so?

Or Is this scenario could only be achieved through binding using MapBinder (The reason why I wouldn't want to use binder is that we would want to define the binding map of key value pair explicitly, but using annotations just simply annotate the implementation class with params - easier maintenance).

Thanks in advance.