当前位置: 首页 > 知识库问答 >
问题:

Scala play Guice注入

晋安国
2023-03-14

我正在使用 scala play 2.5,在尝试在我的一个控制器中注入对象时出现以下错误。我正在使用 play 给出的默认注入框架,即 Guice。

    ProvisionException: Unable to provision, see the following errors: 
    1) No implementation for services.MyService was bound. 
    while locating services.MyService for parameter 0 at controllers.MyController.<init>(MyController.scala:12) 
    while locating controllers.MyController for parameter 3 at router.Routes.<init>(Routes.scala:55) 
    while locating router.Routes 
    while locating play.api.inject.RoutesProvider while locating play.api.routing.Router for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:200) 
    while locating play.api.http.JavaCompatibleHttpRequestHandler 
    while locating play.api.http.HttpRequestHandler for parameter 4 at play.api.DefaultApplication.<init>(Application.scala:221) at play.api.DefaultApplication.class(Application.scala:221) 
while locating play.api.DefaultApplication 
    while locating play.api.Application

这是控制器:

package controllers

import services.MyService

class MyController @Inject()(myService: MyService, val messagesApi: MessagesApi) extends Controller with I18nSupport {

    def someFunctionThatUsesMyService(url: String) = Action {}
}

以下是我想注入的服务:

package services

import javax.inject._

trait MyService {
    def op(param1: String, param2: String): Boolean
}

@Singleton
class BasicMyService extends MyService {
    override def op(param1: String, param2: String): Boolean = true
}

这就是我使用它的方式:

@Singleton
class HomeController @Inject() extends Controller {

  /**
   * Create an Action to render an HTML page with a welcome message.
   * The configuration in the `routes` file means that this method
   * will be called when the application receives a `GET` request with
   * a path of `/`.
   */
  def index = Action {
    //Ok(views.html.index("Your new application is ready."))
    Redirect(routes.MyController.someFunctionThatUsesMyService(Some(routes.OtherController.welcomePage().url)))
  }

}

共有2个答案

祁远
2023-03-14

你能尝试直接注入服务吗?为什么你需要那层虚拟特征?所有的东西都必须开箱即用,没有任何额外的编码。您可以随时微调外部部门。参见下面的示例。

下面是一些代码

控制器:

class MyController @Inject()(service: SomeConcreteService) extends Controller { /** just use service.anyMethod here */ }

服务:

@Singleton
class SomeConcreteService @Inject()(otherStuff: OtherStuffConcrete){
/** otherStuff will be also injected */
    def mySuperServiceMethod:={ "Hey!" }
}

测试:

class MyControllerTest extends PlaySpec with OneAppPerSuite with MockitoSugar {

    // do it this way if you want framework to provide controller instance
    private val myController = app.injector.instanceOf[MyController]

    // or mock external deps and build controller on your own
    val externalService = mock[SomeConcreteService]
    val handMadeController = new MyController(externalService)

    "My controller" should{
        "do its best " in {
            val response = call(handMadeController.doStuff, FakeRequest())

            status(response) mustBe OK

            contentAsString(response) must include("Best controller")

    }
}
郎飞航
2023-03-14

您应该向服务特征添加< code>ImplementedBy注释

package services

import javax.inject._

@ImplementedBy(classOf[BasicMyService])
trait MyService {
    def op(param1: String, param2: String): Boolean
}

@Singleton
class BasicMyService extends MyService {
    override def op(param1: String, param2: String): Boolean = true
}
 类似资料:
  • imi 中有一类注解,他们支持将值动态注入到注解属性中,当调用获取注解属性时,才实时计算并返回。 注解说明 @ConstValue 从常量中读取值 属性名称 说明 name 常量名 default 常量不存在时,返回的默认值 @ConfigValue 从配置中读取值 属性名称 说明 name 配置名,支持@app、@currentServer等用法 default 配置名,支持@app、@curr

  • 和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?

  • 理解DLL 首先我们需要知道我们在启动一个程序的时候并没有把所有的需要用到的数据或者文件运行起来,而是只运行了关键部分,那么当我们需要调用到某一功能时再通过DLL来动态链接,不需要时就可以卸载,使得程序不显得臃肿。 DLL注入是什么 DLL注入就是将代码插入/注入到正在运行的进程中的过程。我们注入的代码是动态链接库(DLL)的形式。为什么可以做到这一点?因为DLL(如UNIX中的共享库)是在运行时

  • Java 元数据(Metadata)规范(JSR-175),是J2SE 5.0和更高版本的一部分,提供一种在Java代码中指定配置数据的方法。Java代码中的元数据也被称为注解。在JavaEE中,注解用于声明对外部资源的依赖和在Java代码中的配置数据而无需在配置文件中定义该数据。 本节描述了在Java EE技术兼容的Servlet容器中注解和资源注入的行为。本节扩展了Java EE规范第5节标题

  • 我是Spring Security的新手。我看过很多关于如何通过外部属性文件的注释注入值的文章。我尝试了很多方法,但最终都是用java。lang.IllegalArgumentException:无法解析占位符“val.id”异常。 你能给我一些提示如何处理这个例外吗? 我的java类如下所示: 我的属性文件名为val.properties,位于WEB-INF下,其内容为val.id=xyz 我将

  • 我有一个pb,我找不到解决方案,因为我认为我的项目中有多个pb相关: 有人能帮我吗?我可以给你链接到git存储库,也可以看到所有的项目。谢谢。

  • 我找到了一些答案:https://stackoverflow.com/a/21218921/2754014 关于依赖注入。没有任何注释,如,或。让我们假设此示例没有任何 XML 配置 的 bean (除了简单

  • 主要内容:防止 SQL 注入如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种情况的发生,确保脚本和 SQLite 语句的安全。 注入通常在请求用户输入时发生,比如需要用户输入姓名,但用户却输入了一个 SQLite 语句,而这语句就会在不知不觉中在数据库上运行。 永远不要相信用户提供的数据,所以只处理通过验证的数据,