如何在使用Maven时在Play框架项目中注入WSClient?

问题描述 投票:1回答:1

在创建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)
scala maven playframework ws-client
1个回答
3
投票

正如文件所说:

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

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

如果您有Play SBT项目,您仍然可以通过在build.sbt中添加以下行来添加WS:

libraryDependencies += ws

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.