将现有SBT Scala应用程序转换为Play

时间:2015-06-17 17:54:39

标签: scala playframework sbt akka

我一直在努力与Akka演员建立一个应用程序,现在我已经完成了基于actor的业务逻辑,我想给它一个RESTful + websocket前端。我试图找到如何在现有应用程序的上下文中设置Play的说明。我能找到的唯一指令是如何创建新的Play应用程序。有没有关于如何做到这一点的文件?

更新:这个问题与SBT设置有关,而不是将控制器连接到基于actor的业务逻辑。我尝试修改build.sbtplugins.sbt以包含激活器在我activator new时构建的内容,但IDEA抱怨Cannot resolve symbol PlayScala。另外,我想知道如何将我的演员从SBT标准src/main/scala移动到app/ - 如果它在app/actors中(正如我在其中一个模板中看到的那样)或{{1} }

这是我的app/models

build.sbt

这是我的name := "test" version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(play.PlayScala) scalaVersion := "2.11.6" libraryDependencies ++= Seq( jdbc, cache, ws, specs2 % Test ) resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases" scalaVersion := "2.11.6" resolvers += "repo.novus rels" at "http://repo.novus.com/releases/" resolvers += "repo.novus snaps" at "http://repo.novus.com/snapshots/" libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.1" % "test" libraryDependencies += "com.github.nscala-time" %% "nscala-time" % "1.8.0" libraryDependencies += "org.slf4j" % "slf4j-simple" % "1.6.4" libraryDependencies += "org.reactivemongo" %% "reactivemongo" % "0.10.5.0.akka23" routesGenerator := InjectedRoutesGenerator

plugins.sbt

3 个答案:

答案 0 :(得分:1)

更新答案:

从项目文件开始activator 然后使用run启动网络应用 并使用http://localhost:9000打开浏览器 这将加载所有依赖项并编译Scala Play应用程序。

这应该纠正您关于缺少依赖关系的IDEA Ide问题。

在Scala Play 2.4中,您可以选择Project Layouts。

  • 项目布局app/
  • SBT和Maven项目使用的项目布局src/main/scala是新的和实验性的,可能会有问题。

之前(播放2.3及更小) 那里只有项目布局app/

三个包

app/controllers -> Application controllers
app/models -> Application business layer
app/views -> Templates

是预定义的。

您当然可以添加自己的软件包,例如app/actors软件包。

答案 1 :(得分:0)

一部分是将Playlayer(基于演员的业务逻辑 - 一个ActorSystem)与Play MVC中的Controller(play.api.mvc.Controller)连接起来。
以下示例显示了如何执行此操作:

import play.api.mvc._
import akka.actor._
import javax.inject._

import actors.HelloActor

@Singleton
class Application @Inject() (system: ActorSystem) extends Controller {

  val helloActor = system.actorOf(HelloActor.props, "hello-actor")

  //...
}

然后你需要了解Play Framework的一些内容:

  • 路由器将每个传入的HTTP请求转换为动作调用(控制器类中的公共方法)。
  • Controller包含一些操作。
  • 动作在您的Businesslayer(您的演员系统)中做一些工作并返回结果

现在定义一些路径请求路径:

- GET   /clients/all          controllers. ... .list()
- GET   /clients/:id          controllers. ... .show(id: Long)

在Controller中实现Action:

import play.api.libs.concurrent.Execution.Implicits.defaultContext
import scala.concurrent.duration._
import akka.pattern.ask
implicit val timeout = 5.seconds

def show(id: Long) = Action.async {
  // This ist a ask pattern returns a Future
  // Here ist the Connection between the Action from Play to your
  // Actor System - your Business Layer
  // map it to your own result type
  (helloActor ? SayHello(id)).mapTo[String].map { message =>
    Ok(message)
  }
}

答案 2 :(得分:0)

项目的以下更改帮助我将PlayFramework(版本:2.8.1)引入了现有项目:

  1. plugins.sbt中添加 addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.1")

  2. build.sbt中,将以下内容添加到libraryDependencies中: "com.typesafe.play" %% "play" % playVersion

    2.1:在guice

    中添加libraryDependencies ++= Seq(guice)支持

    2.2:添加以下内容以将/src包括到类路径中: unmanagedSourceDirectories in Compile += baseDirectory.value / "src"

  3. 添加/src目录以将其添加到classpath并验证:

[info] Loading global plugins from /home/training/.sbt/1.0/plugins
[info] Loading settings for project coursera-build from plugins.sbt ...
[info] Loading project definition from /home/training/IdeaProjects/coursera/project
[info] Loading settings for project root from build.sbt ...
[info] Set current project to coursera (in build file:/home/training/IdeaProjects/coursera/)
[info] * /home/training/IdeaProjects/coursera/app-2.12
[info] * /home/training/IdeaProjects/coursera/app
[info] * /home/training/IdeaProjects/coursera/app
[info] * /home/training/IdeaProjects/coursera/src

PlayFramework期望满足以下条件:

  1. controllers in app/controllers-在此处添加您的controller.scala

  2. application.conf中的
  3. conf

  4. routes中的
  5. conf-在步骤1中添加引用控制器的路由

执行:sbt run

参考:The official repo