Как внедрить 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.

Другие вопросы по тегам