使用Maven时如何在WS Framework项目中注入WSClient?

时间:2019-02-25 12:45:40

标签: scala maven playframework ws-client

在创建Play框架项目并使用WSClient进行REST调用时,官方Play框架文档建议将ws添加到build.sbt中以管理依赖项。如果使用Maven,则ws依赖项包含在:

<dependency>
  <groupId>com.typesafe.play</groupId>
  <artifactId>play-ws_2.12</artifactId>
  <version>${play2.version}</version>
</dependency>

但是,当尝试使用如下所示的片段调用Web服务时:

@Singleton
class Controller @Inject()(
  ws: WSClient,
  controllerComponents: ControllerComponents
)(implicit ec: ExecutionContext)
  extends AbstractController(controllerComponents) {
  def callApi(): Action[AnyContent] = Action.async { _ =>
    ws
      .url("https://mywebservice.com/api/bla")
      .get()
      .map(response => Ok(response.body.toString))
  }
}

然后出现以下错误:

CreationException: Unable to create injector, see the following errors:

1) No implementation for play.api.libs.ws.WSClient was bound.
  while locating play.api.libs.ws.WSClient
    for the 1st parameter of controllers.MyController.<init>(MyController.scala:13)
  while locating controllers.MyController
    for the 3rd parameter of router.Routes.<init>(Routes.scala:33)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:123):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$4)

1 个答案:

答案 0 :(得分:3)

如文档所述:

  

注意:在Play 2.6中,Play WS被分为两个部分,   不依赖Play的独立客户端,顶部有包装器   使用Play特定类。此外,阴影版本   现在在Play WS中使用AsyncHttpClient和Netty来最小化库   冲突,主要是为了让Play的HTTP引擎可以使用其他   Netty版本。请参阅2.6迁移指南以了解更多信息   信息。

看看2.6迁移指南,我们可以阅读:

  

如果您有Play SBT项目,则仍可以通过添加   您的build.sbt的以下行:

libraryDependencies += ws
  

这包括play-ahc-ws模块[...]

因此,要解决该问题,我们必须在Maven的pom.xml中添加 play-ahc-ws 模块:

<dependency>
  <groupId>com.typesafe.play</groupId>
  <artifactId>play-ahc-ws_2.12</artifactId>
  <version>${play2.version}</version>
</dependency>

如果像在代码示例中一样使用Guice,则依赖项注入将由Guice处理。