我有一个api服务类,它依赖于play的配置和WSClient实例。
我不想使用@Inject()anotation因为我想在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]
lazy val conf:配置=连线[配置]错误:无法找到公共构造函数或配对对象 [play.api.libs.ws.WSClient] lazy val wsc:WSClient = wire [WSClient]
有人知道我该如何解决这个问题......?为什么会这样:/
谢谢!
答案 0 :(得分:0)
Configuration
是一个playframework配置,internally uses Typesafe' s Config library。引用Playframework docs:
Play使用的配置文件基于Typesafe config library
您获得的异常会告诉您 - 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's Configuration docs中描述的配置覆盖技术,因为它实际上是由typesafe配置库提供(来自Typesafe Config GitHub自述文件):
用户可以使用Java系统属性覆盖配置,java -Dmyapp.foo.bar = 10
关于WSClient
:这是因为WSClient
不是一个类,而是a trait。您需要连接实际实现,即NingWSClient
,如下所示:
trait ApiDependencies {
lazy val conf: Configuration = wire[Configuration]
lazy val wsc: WSClient = wire[NingWSClient]
}
请参阅WSClient
scaladoc以获取实施类的列表(在"所有已知的实现类和#34下) - 到撰写本文时,只有NingWSClient
和AhcWSClient
。哪个更好是一个不同的(可能是基于意见的问题)。