在创建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)
正如文件所说:
注意:在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处理。