在创建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)
答案 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处理。