Не в состоянии играть зависимости с Macwire

У меня есть класс обслуживания API, который зависит от конфигурации игры и экземпляров WSClient.

и я не хочу использовать аннотацию @Inject(), потому что я хочу использовать инъекцию во время компиляции с Macwire, поэтому я сделал следующее:

// this is a trait that here im wiring all the dependencies that my api service needs
trait ApiDependencies {

  lazy val conf: Configuration = wire[Configuration]
  lazy val wsc: WSClient = wire[WSClient]

}


// this is the api service

class ApiService extends ApiDependencies {

  def getInfo (id: String): Future[Option[Info]] = {
    wsc.url("...").withHttpHeaders(("Content-Type", "application/json")).get.map { response =>
      response.status match {
        case Status.OK => ...
        case Status.NO_CONTENT => ...
        case _ => throw new Exception()
      }
    }
  }
}

но я получаю ошибку компилятора:

Ошибка: не удается найти значение типа: [com.typesafe.config.Config]
Ленивый val conf: Конфигурация = провод [Конфигурация]

Ошибка: не удается найти открытый конструктор или сопутствующий объект для [play.api.libs.ws.WSClient] lazy val wsc: WSClient = wire[WSClient]

кто-то знает, как я могу решить эту проблему...? и почему это происходит:/

Спасибо!

1 ответ

Configuration Конфигурация playframework, которая внутренне использует библиотеку Config Typesafe. Цитирование документов Playframework:

Файл конфигурации, используемый Play, основан на библиотеке настроек Typesafe.

Исключение, которое вы получаете, говорит именно об этом - macwire не может создать экземпляр Configuration как нет Config экземпляр в объеме.

Чтобы это исправить, вам, очевидно, необходимо предоставить такой набор. Самый простой способ сделать это, вероятно, будет выглядеть так:

import com.typesafe.config.{Config, ConfigFactory}
trait ApiDependencies {
    lazy val configuration: Config = ConfigFactory.load()
    lazy val conf: Configuration = wire[Configuration]
}

Обратите внимание, что ConfigFactory.Load() в основном использует файл конфигурации по умолчанию (application.conf) и учитывает методы переопределения конфигурации, описанные в документации по настройке Play, поскольку она фактически предоставляется библиотекой typesafe config (из readme Typesafe Config GitHub):

пользователи могут переопределить конфигурацию с помощью системных свойств Java, java -Dmyapp.foo.bar=10


относительно WSClient: это связано с тем, что WSClient это не класс, а черта. Вам нужно связать актуальную реализацию, т.е. NingWSClient, как это:

trait ApiDependencies {
  lazy val conf: Configuration = wire[Configuration]
  lazy val wsc: WSClient = wire[NingWSClient]
}

Увидеть WSClient scaladoc для списка реализующих классов (в разделе "Все известные реализующие классы") - к моменту написания есть только NingWSClient а также AhcWSClient, Какой из них лучше, это другой (и потенциально основанный на мнении вопрос).

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