Как внедрить WSClient в проект платформы Play при использовании Maven? - PullRequest
0 голосов
/ 25 февраля 2019

При создании проекта 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 Ответ

0 голосов
/ 25 февраля 2019

Как сказано в документации:

Примечание. В Play 2.6 Play WS был разделен на две части с базовым автономным клиентом, не зависящим от 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.

...