Не в состоянии играть зависимости с 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
, Какой из них лучше, это другой (и потенциально основанный на мнении вопрос).