我有一个api服务类,它依赖于play的配置和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 : Configuration = wireConfiguration 错误:找不到公共构造函数或play.api.libs.ws.WSClient懒val的伴生对象: WSClient = wireWSClient
有人知道我该怎么解决这个问题吗?以及为什么会发生这样的事情
谢谢!
发布于 2017-07-04 13:30:48
Configuration是一个游戏框架配置,内部用途 Typesafe的配置库。引用Playframework文档
Play使用的配置文件基于Typesafe配置库
您所得到的异常告诉您,由于作用域中没有Configuration实例,因此macwire无法创建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配置库(来自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。哪一个更好是另一个问题(也可能是基于观点的问题)。
https://stackoverflow.com/questions/44904938
复制相似问题