Как внедрить WSClient в проект платформы Play при использовании Maven?

При создании проекта платформы 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>

Однако при попытке позвонить в веб-службу с помощью такого фрагмента:

@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)

person Jac    schedule 25.02.2019    source источник


Ответы (1)


Как говорится в документации:

Примечание. В Play 2.6 Play WS был разделен на две части: базовый автономный клиент, который не зависит от Play, и надстройка-оболочка, использующая специальные классы Play. Кроме того, в Play WS теперь используются затененные версии AsyncHttpClient и Netty, чтобы свести к минимуму конфликты библиотек, в первую очередь для того, чтобы 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.

person Jac    schedule 25.02.2019