【问题标题】:Why Guice cannot find my implementation in Play framework?为什么 Guice 在 Play 框架中找不到我的实现?
【发布时间】:2018-08-04 21:27:54
【问题描述】:

我的控制器代码有一个 trait 和该 trait 的实现,它也扩展了 CustomeExecutionContext,但 Guice 找不到我的实现。

控制器代码:

package controllers

import javax.inject._
import play.api._
import play.api.mvc._
import play.api.libs.json._
import com.ntu.rule._
import akka.actor.ActorSystem
import scala.concurrent.Future
import play.api.libs.concurrent._
import scala.concurrent.ExecutionContext

trait RuleValidationExecutionContext extends ExecutionContext

class RuleValidationExecutionContextImpl @Inject()(system: ActorSystem)
  extends CustomExecutionContext(system, "rule-validation-context") with RuleValidationExecutionContext

@Singleton
class RulesController @Inject()(cc: ControllerComponents,
                                ruleValidationExecutionContext: RuleValidationExecutionContext) extends AbstractController(cc) {

  def validate() = Action(parse.json).async { implicit request: Request[JsValue] =>
    Future {
      val rule = (request.body \ "rule").as[String]
      val parsedRule = RuleUtils.parseRules(rule)
      val (isSuccess, message) = RuleUtils.validate(parsedRule)
      Ok(Json.parse(
        s"""
           |{"success": $isSuccess, "message": "$message"}
      """.stripMargin))
    }(ruleValidationExecutionContext)
  }
}

还有application.conf:

rule-validation-context {
  fork-join-executor {
    parallelism-factor = 20.0
    parallelism-max = 200
  }
}

当我请求操作时,它会显示:

1 error]
        at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1.reload(DevServerStart.scala:186)
        at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1.get(DevServerStart.scala:124)
        at play.core.server.AkkaHttpServer.play$core$server$AkkaHttpServer$$modelConversion(AkkaHttpServer.scala:183)
        at play.core.server.AkkaHttpServer.play$core$server$AkkaHttpServer$$handleRequest(AkkaHttpServer.scala:189)
        at play.core.server.AkkaHttpServer$$anonfun$5.apply(AkkaHttpServer.scala:106)
        at play.core.server.AkkaHttpServer$$anonfun$5.apply(AkkaHttpServer.scala:106)
        at akka.stream.impl.fusing.MapAsync$$anon$24.onPush(Ops.scala:1191)
        at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:512)
        at akka.stream.impl.fusing.GraphInterpreter.processEvent(GraphInterpreter.scala:475)
        at akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:371)
Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) No implementation for controllers.RuleValidationExecutionContext was bound.
  while locating controllers.RuleValidationExecutionContext
    for the 2nd parameter of controllers.RulesController.<init>(RulesController.scala:19)
  while locating controllers.RulesController
    for the 4th parameter of router.Routes.<init>(Routes.scala:38)
  while locating router.Routes
  while locating play.api.inject.RoutesProvider
  while locating play.api.routing.Router
    for the 1st parameter of play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:222)
  while locating play.api.http.JavaCompatibleHttpRequestHandler
  while locating play.api.http.HttpRequestHandler
    for the 6th parameter of play.api.DefaultApplication.<init>(Application.scala:236)
  at play.api.DefaultApplication.class(Application.scala:235)
  while locating play.api.DefaultApplication
  while locating play.api.Application

但是实现在上面的控制器代码中,为什么Guice找不到呢? 我的 Scala 版本是 2.11.11,Play Framework 版本是 2.6.11

【问题讨论】:

    标签: scala playframework playframework-2.0 guice


    【解决方案1】:

    我猜原因是 Guice 需要更多关于应该为 ruleValidationExecutionContext 类型的参数实例化哪个实例的信息。虽然在RuleValidationExecutionContextImpl 类中添加了@inject 注解,但它与ruleValidationExecutionContext 的类型不同。你可以做

    1. 添加另一个注释

      @ImplementedBy(classOf[RuleValidationExecutionContextImpl]) 特征 RuleValidationExecutionContext 扩展 ExecutionContext //等等等等……

    1. 在您的module.scala 中添加如下内容

    ```

    import com.google.inject.AbstractModule
    
    class Module extends AbstractModule {
      def configure() = {
        bind(classOf[RuleValidationExecutionContext])
          .to(classOf[RuleValidationExecutionContextImpl])
      }
    }
    

    ```

    请参考this link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      相关资源
      最近更新 更多