【问题标题】:Calling into Play framework app from the Scala console从 Scala 控制台调用 Play 框架应用程序
【发布时间】:2015-05-28 18:39:17
【问题描述】:

我有一个 Play Framework 2.3 应用。我可以使用activator console 进入 Scala 控制台。但是,当我尝试从我的应用程序调用代码时,特别是一些使用 WS 的辅助函数,它使用隐式 import play.api.Play.current 来检索当前正在运行的应用程序,我收到错误消息 java.lang.RuntimeException: There is no started application

我必须采取哪些步骤才能将我的应用加载到当前控制台会话中?

a similar existing question,但接受的答案似乎是使用框架测试助手中的模拟应用程序。最好,我想在我的实际应用程序的上下文中运行。如果我必须使用一个假的应用程序,是否可以让它匹配我的开发环境(运行activator run 时得到的)而不是我的测试环境(运行单元测试时得到的)?

提前致谢!

【问题讨论】:

  • 这样跑的目的是什么?
  • @cchantep 能够在 REPL 中玩玩玩玩真是太好了。
  • 同样,你可以使用StaticApplication stackoverflow.com/questions/24435415/… 这个问题本质上问的是同样的事情,除了需要数据库的模型。共同点是它们都需要隐式应用程序。
  • 感谢您的链接!
  • 这个答案可能会有所帮助:stackoverflow.com/questions/31224187/…

标签: scala playframework playframework-2.3


【解决方案1】:

对于未来的读者,对于 Play framework 2.5.x:

import play.api._
val env = Environment(new java.io.File("."), this.getClass.getClassLoader, Mode.Dev)
val context = ApplicationLoader.createContext(env)
val loader = ApplicationLoader(context)
val app = loader.load(context)
Play.start(app)

来源:https://www.playframework.com/documentation/2.5.x/PlayConsole#Launch-the-interactive-console

【讨论】:

    【解决方案2】:

    在这种特定情况下,您可以只创建一个应用程序实例并使用它来代替隐式实例:

    // Tested in 2.3.7
    import play.api.{Play, Mode, DefaultApplication}
    import java.io.File
    import play.api.libs.ws.WS
    
    val application = new DefaultApplication(
        new File("."),
        Thread.currentThread().getContextClassLoader(),
        None,
        Mode.Dev
    )
    
    import scala.concurrent.ExecutionContext.Implicits.global
    
    WS.client(application).url("http://www.google.com").get().map((x) => println(x.body))
    

    【讨论】:

    • 感谢您的澄清!
    • 感谢这个。我需要一个额外的Play.start(application) 才能开始
    猜你喜欢
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多