Scala 为什么Guice在Play框架中找不到我的实现?
我的控制器代码有一个trait和该trait的一个实现,该trait还扩展了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
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
的类型不同。你能行
模块.scala
import com.google.inject.AbstractModule
class Module extends AbstractModule {
def configure() = {
bind(classOf[RuleValidationExecutionContext])
.to(classOf[RuleValidationExecutionContextImpl])
}
}