Scala 为什么Guice在Play框架中找不到我的实现?

Scala 为什么Guice在Play框架中找不到我的实现?,scala,playframework,playframework-2.0,guice,Scala,Playframework,Playframework 2.0,Guice,我的控制器代码有一个trait和该trait的一个实现,该trait还扩展了CustomeeExecutionContext,但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 imp

我的控制器代码有一个trait和该trait的一个实现,该trait还扩展了
CustomeeExecutionContext
,但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
1错误]
play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1.reload(DevServerStart.scala:186)
在play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1.get(DevServerStart.scala:124)
在play.core.server.AkkaHttpServer.play$core$server$AkkaHttpServer$$modelConversion(AkkaHttpServer.scala:183)
在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)
在akka.stream.impl.fusing.mapsync$$anon$24.onPush中(Ops.scala:1191)
在akka.stream.impl.fusing.graphinterpler.processPush(graphinterpler.scala:512)
在akka.stream.impl.fusing.graphinterpler.processEvent(graphinterpler.scala:475)
在akka.stream.impl.fusing.graphinterpler.execute(graphinterpler.scala:371)
原因:com.google.inject.ProvisionException:无法设置,请参阅以下错误:
1) 未绑定controllers.RuleValidationExecutionContext的实现。
查找控制器时。RuleValidationExecutionContext
用于controllers.RulesController的第二个参数。(RulesController.scala:19)
查找控制器时。规则控制器
用于router.Routes的第四个参数。(Routes.scala:38)
定位路由器时。路由
查找play.api.inject.routeProvider时
查找play.api.routing.Router时
用于play.api.http.JavaCompatibleHttpRequestHandler的第一个参数。(HttpRequestHandler.scala:222)
查找play.api.http.JavaCompatibleHttpRequestHandler时
查找play.api.http.HttpRequestHandler时
用于play.api.DefaultApplication的第6个参数。(Application.scala:236)
at play.api.DefaultApplication.class(Application.scala:235)
查找play.api.DefaultApplication时
查找play.api.Application时
但是实现在上面的控制器代码中,为什么Guice找不到它??
我的Scala版本是2.11.11,Play Framework版本是2.6.11

我想原因是Guice需要更多关于应该为类型为
ruleValidationExecutionContext
的参数实例化哪个实例的信息。尽管您将
@inject
注释添加到类
RuleValidationExecutionContextImpl
,但它与
ruleValidationExecutionContext
的类型不同。你能行

  • 添加另一个注释

    @实现者(classOf[RuleValidationExecutionContextImpl]) trait RuleValidationExecutionContext扩展了ExecutionContext //胡说八道

  • 将如下内容添加到您的
    模块.scala
  • ```

    ```

    请参阅

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