将现有的 SBT Scala 应用程序转换为 Play
Convert existing SBT Scala application to Play
我一直致力于使用 Akka actors 构建应用程序,现在我已经完成了基于 actor 的业务逻辑,我想给它一个 RESTful + websocket 前端。我正在尝试查找有关如何在现有应用程序的上下文中设置 Play 的说明。我能找到的唯一说明是如何创建新的 Play 应用程序。是否有关于如何执行此操作的文档?
更新:这个问题更多地与 SBT 设置有关,而不是将控制器连接到我基于参与者的业务逻辑。我试图修改 build.sbt
和 plugins.sbt
以包含激活器在我执行 activator new
时构建的内容,但 IDEA 抱怨 Cannot resolve symbol PlayScala
。此外,我想知道如何将我的演员从 SBT 标准 src/main/scala
移动到 app/
——它应该在 app/actors
中(正如我在其中一个模板中看到的那样)还是在 [=19 中=] ?
这是我的 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
:
logLevel := Level.Warn
// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.0")
// web plugins
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.6")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.3")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")
一部分是将您的业务层(基于参与者的业务逻辑 - 一个 ActorSystem)与 Play MVC 中的控制器 (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 请求转换为操作调用(控制器 class 中的 public 方法)。
- 控制器包含一些动作。
- Action 在您的 Businesslayer(您的 Actor 系统)中做一些工作并且 Return 结果
现在定义一些路由请求路径:
- GET /clients/all controllers. ... .list()
- GET /clients/:id controllers. ... .show(id: Long)
并在您的控制器中实施操作:
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)
}
}
更新答案:
从您的项目文件开始 activator
然后使用 run
启动网络应用程序
并使用 http://localhost:9000 打开浏览器
这将加载所有依赖项并编译 Scala Play 应用程序。
这应该更正您的 IDEA Ide 缺少依赖项的问题。
在 Scala Play 2.4 中,您可以选择项目布局。
- 项目布局
app/
- SBT 和 Maven 项目使用的项目布局
src/main/scala
是新的和实验性的,可能有问题。
之前(播放 2.3 及更小版本)
只有项目布局 app/
三个包
app/controllers -> Application controllers
app/models -> Application business layer
app/views -> Templates
已预定义。
您当然可以添加自己的包,例如 app/actors
包。
项目的以下更改帮助我在现有项目中采用 PlayFramework(版本:2.8.1):
在plugins.sbt
中添加
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.1")
在 build.sbt
中将以下内容添加到 libraryDependencies
:
"com.typesafe.play" %% "play" % playVersion
2.1:在libraryDependencies ++= Seq(guice)
中添加guice
支持
2.2:添加以下内容以将 /src
包含到类路径中:
unmanagedSourceDirectories in Compile += baseDirectory.value / "src"
添加/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 需要以下内容:
controllers
在 app/controllers
- 在此处添加您的 controller.scala
application.conf
在 conf
routes
in conf
- 在步骤 1
添加一个引用控制器的路由
执行:sbt run
我一直致力于使用 Akka actors 构建应用程序,现在我已经完成了基于 actor 的业务逻辑,我想给它一个 RESTful + websocket 前端。我正在尝试查找有关如何在现有应用程序的上下文中设置 Play 的说明。我能找到的唯一说明是如何创建新的 Play 应用程序。是否有关于如何执行此操作的文档?
更新:这个问题更多地与 SBT 设置有关,而不是将控制器连接到我基于参与者的业务逻辑。我试图修改 build.sbt
和 plugins.sbt
以包含激活器在我执行 activator new
时构建的内容,但 IDEA 抱怨 Cannot resolve symbol PlayScala
。此外,我想知道如何将我的演员从 SBT 标准 src/main/scala
移动到 app/
——它应该在 app/actors
中(正如我在其中一个模板中看到的那样)还是在 [=19 中=] ?
这是我的 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
:
logLevel := Level.Warn
// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.0")
// web plugins
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.6")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.3")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")
一部分是将您的业务层(基于参与者的业务逻辑 - 一个 ActorSystem)与 Play MVC 中的控制器 (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 请求转换为操作调用(控制器 class 中的 public 方法)。
- 控制器包含一些动作。
- Action 在您的 Businesslayer(您的 Actor 系统)中做一些工作并且 Return 结果
现在定义一些路由请求路径:
- GET /clients/all controllers. ... .list()
- GET /clients/:id controllers. ... .show(id: Long)
并在您的控制器中实施操作:
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)
}
}
更新答案:
从您的项目文件开始 activator
然后使用 run
启动网络应用程序
并使用 http://localhost:9000 打开浏览器
这将加载所有依赖项并编译 Scala Play 应用程序。
这应该更正您的 IDEA Ide 缺少依赖项的问题。
在 Scala Play 2.4 中,您可以选择项目布局。
- 项目布局
app/
- SBT 和 Maven 项目使用的项目布局
src/main/scala
是新的和实验性的,可能有问题。
之前(播放 2.3 及更小版本)
只有项目布局 app/
三个包
app/controllers -> Application controllers
app/models -> Application business layer
app/views -> Templates
已预定义。
您当然可以添加自己的包,例如 app/actors
包。
项目的以下更改帮助我在现有项目中采用 PlayFramework(版本:2.8.1):
在
plugins.sbt
中添加addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.1")
在
build.sbt
中将以下内容添加到libraryDependencies
:"com.typesafe.play" %% "play" % playVersion
2.1:在
中添加libraryDependencies ++= Seq(guice)
guice
支持2.2:添加以下内容以将
/src
包含到类路径中:unmanagedSourceDirectories in Compile += baseDirectory.value / "src"
添加
/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 需要以下内容:
controllers
在app/controllers
- 在此处添加您的 controller.scalaapplication.conf
在conf
routes
inconf
- 在步骤 1 添加一个引用控制器的路由
执行:sbt run