无法与Macwire连接播放依赖

时间:2017-07-04 11:37:02

标签: java scala dependency-injection playframework macwire

我有一个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]

有人知道我该如何解决这个问题......?为什么会这样:/

谢谢!

1 个答案:

答案 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下) - 到撰写本文时,只有NingWSClientAhcWSClient。哪个更好是一个不同的(可能是基于意见的问题)。