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

如何在 Play Guice 模块中访问请求?

舒仲渊
2023-03-14

我正在编写一个处理多个系统的应用程序。用户可以选择他想使用的系统,我将该系统ID存储在会话(客户端会话)中

现在我有了服务类,比如说CustomerService。

class CustomerService(val systemID: String) {
    // Implementation
}

我想使用 Guice 将客户实例注入控制器。但是我想使用存储在会话中的系统ID实例化客户服务。

如何访问<code>请求。Guice模块中的会话?

编辑:

简化了我上面的代码。我的实际代码使用接口。我如何使用辅助注射?

trait CustomerService(val systemID: String) {
    // Definition
}

object CustomerService{

  trait Factory {
    def apply(systemID: String) : CustomerService
  }

}

class DefaultCustomerService @Inject() (@Assisted systemID: String)
  extends CustomerService {
    // Definition
}

class CustomerController @Inject()(
                            val messagesApi: MessagesApi,
                            csFactory: CustomerService.Factory)
{
}

这给了我:客户服务是一个接口,而不是一个具体类。无法创建AssistedInject工厂。

并且我不想将工厂放在Default怎们服务下,并在控制器中使用Default怎们服务。工厂。这是因为对于单元测试,我将使用Test怎们服务存根,并希望依赖注入将Test怎们服务注入到控制器中,而不是默认客户服务

共有1个答案

盛超
2023-03-14

您不应该这样做。如果您需要注入需要runtime值的东西的实例,您可以使用guice的AssistedInject。

以下是你在玩耍时如何使用它:

1.使用运行时值作为参数创建服务的工厂:

object CustomerService {
  trait Factory {
    def apply(val systemID: String): CustomerService
  }
}

2.用辅助参数实现您的服务

class CustomerService @Inject() (@Assisted systemId: String) { .. }

3.在guice模块中绑定工厂:

install(new FactoryModuleBuilder()
  .implement(classOf[CustomerService], classOf[CustomerServiceImpl])
  .build(classOf[CustomerService.Factory]))

4.最后注入您需要客户服务的工厂:

class MyController @Inject() (csFactory: CustomerService.Factory) { .. }

以下是辅助注射的另一个示例:https://www.playframework.com/documentation/2.5.x/ScalaTestingWebServiceClients

 类似资料:
  • 问题内容: 我想直接在html中使用几个常量(在控制器中几次)。 例如,这是主要的应用程序模块: 因此,很清楚如何使用控制器中的常量。 但是我该怎么做: 关键是将所有路线都放在一个地方。所以,我可以这样做,还是我选择了错误的方式? 问题答案: 恕我直言,更好的方法是使用$ rootScope。 在html中,每个范围都继承自$ rootScope,因此,如果当前作用域中不存在变量,则使用$ roo

  • 问题内容: 我希望能够从导入的模块中动态检索当前执行模块或类名称。这是一些代码: foo.py: bar.py: 这显然不起作用,因为包含该功能的模块的名称是无效的。我希望在模块内部访问的是正在使用的当前执行模块的名称。因此,在上述情况下,将是这样,但是如果导入了其他模块,我想动态地访问该模块的名称。 编辑: 该模块看起来很有希望,但它并不是我一直在寻找的东西。我希望找到的是我可以访问的某种全局或

  • 问题内容: 从v2.0开始,Elasticsearch默认情况下仅在localhost上侦听,但我想在localhost之外发出请求。 例如,允许这样的请求: 但这不是: (从服务器外部,例如:同一LAN中的本地计算机)。 谢谢你的帮助。 问题答案: 在放

  • 我正在编写一个Groovy脚本来使用SOAP Web服务。首先,我在SOAP中导入了我的WSDL并创建了一个项目。 那么所有的SOAP请求都会自动生成。 现在我尝试编写一个Groovy来使用生成的SOAP请求调用SOAP服务。 现在这是我的时髦脚本 我想访问在SOAPUI-CreateNote中生成的相同SOAP请求。我如何访问它? 我的实际需求是访问Groovy脚本中的所有SOAP请求——这样我

  • 问题内容: 在执行ModelForm时,我想根据当前用户是否为超级用户执行不同类型的验证检查。如何访问当前的请求用户? 问题答案: 您可以将用户对象作为额外的参数传递给表单构造函数。 例如 构造函数将如下所示: 然后根据需要在clean_XX表单中使用user

  • 问题内容: 我创建了一个本地EJB,我想从同一VM中的Web模块访问它。我的代码如下所示: 这很好。但是,有人告诉我,如果我正在使用本地bean,则不需要进行查找,我只需要进行如下注入: 但是,如果我尝试这样做,则会在this.userBean上得到一个空异常。建议我的人与JBoss合作,而我正在使用glassfish。难道我做错了什么? 问题答案: @EJB注释仅适用于应用程序服务器控制的类,例