Как внедрить WSClient в проект платформы Play при использовании Maven?
При создании проекта Play Framework и использовании WSClient
Чтобы сделать вызов REST, официальная документация Play Framework предлагает добавить ws
к build.sbt
управлять зависимостями. При использовании Maven зависимость ws включена в:
<dependency>
<groupId>com.typesafe.play</groupId>
<artifactId>play-ws_2.12</artifactId>
<version>${play2.version}</version>
</dependency>
Однако при попытке позвонить в веб-службу, используя такой код:
@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 ответ
Как сказано в документации:
Примечание. В Play 2.6 Play WS был разделен на две части: отдельный автономный клиент, не зависящий от Play, и оболочка сверху, в которой используются классы Play. Кроме того, затененные версии AsyncHttpClient и Netty теперь используются в Play WS, чтобы минимизировать конфликты между библиотеками, в первую очередь для того, чтобы HTTP-движок Play мог использовать другую версию Netty. Пожалуйста, обратитесь к руководству по миграции 2.6 для получения дополнительной информации.
Глядя на руководство по миграции 2.6, мы можем прочитать:
Если у вас есть проект Play SBT, вы все равно можете добавить WS, добавив следующую строку в свой build.sbt:
libraryDependencies += ws
Это включает в себя модуль play-ahc-ws [...]
Поэтому, чтобы решить эту проблему, мы должны добавить модуль play-ahc-ws в pom.xml Maven:
<dependency>
<groupId>com.typesafe.play</groupId>
<artifactId>play-ahc-ws_2.12</artifactId>
<version>${play2.version}</version>
</dependency>
При использовании Guice, как в примере кода, внедрение зависимостей будет обрабатываться Guice.