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

5
我一直在使用Akka actors构建应用程序,现在我已经完成了基于actor的业务逻辑,想要给它添加RESTful + websocket前端。我正在尝试查找如何在现有应用程序的上下文中设置Play的说明。我只能找到如何创建新的Play应用程序的说明。是否有关于如何做到这一点的文档?
更新:这个问题与连接控制器到基于actor的业务逻辑更多地涉及到SBT设置。我尝试修改build.sbtplugins.sbt以包含activator在我执行activator new时构建的内容,但是IDEA报错无法解析符号PlayScala。另外,我想知道将我的actors从SBT标准的src/main/scala移动到app/的位置——它应该在app/actors(如模板中所示)还是在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文件:

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")

要使用此布局,请使用disablePlugins(PlayLayoutPlugin)https://www.playframework.com/documentation/2.4.x/Anatomy 您可能需要查看此内容。 - jilen
3个回答

1

更新回答:

在您的项目文件中启动activator, 然后使用run启动Web应用程序, 并使用http://localhost:9000打开浏览器。 这将加载所有依赖项并编译Scala Play应用程序。

这应该可以解决您在IDEA Ide中遇到的有关缺少依赖项的问题。

在Scala Play 2.4中,您可以选择两种项目布局。

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

之前(Play 2.3及更低版本) 只有项目布局app/

这三个包

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

是预定义的。

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


0

其中一部分是将您的业务层(基于Actor的业务逻辑 - 一个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框架的知识:

  • 路由器将每个传入的HTTP请求转换为一个操作调用(控制器类中的公共方法)。
  • 控制器包含一些操作。
  • 操作在您的业务层(您的Actor系统)中执行一些工作并返回结果。

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

- 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)
  }
}

谢谢@robert-halter,这很有帮助。我的问题实际上更多与SBT设置有关,以及我应该把文件放在哪里。默认的SBT配置将我的源代码放在src/main/scala中,但Play有不同的文件结构,并且它说我应该disablePlugins(PlayLayoutPlugin)。此外,我对如何设置我的build.sbt和plugins.sbt感到困惑。我尝试使用activator创建一个新的play应用程序,并将这些更改迁移到我的现有应用程序的build.sbt和plugins.sbt中,但IDEA会出现诸如“无法解析符号PlayScala”的错误提示。 - Sameer Parekh Brenn
我根据此处的指示 https://www.playframework.com/documentation/2.4.x/NewApplication 编辑了我的 plugins.sbt 和 build.sbt 文件,但在你的示例代码中,ControllerInject 均显示 无法解析符号 错误。但是我的 build.sbt 文件对于 PlayScala 却没有出现 无法解析符号 的错误。 - Sameer Parekh Brenn
1
@SameerParekhBrenn:play.PlayScala是一个插件名称。Controller来自于addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.9") -> 这可能会在您的IDEA IDE中出现问题。有关Inject,请参见Cantt locate InjectActors的插件示例 - Robert Halter
1
@SameerParekhBrenn:对于Play 2.4:类javax.inject.Inject在javax.inject-1.jar中。 - Robert Halter

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:在 libraryDependencies ++= Seq(guice)中添加 guice 支持

    2.2:添加以下内容以包括 /src 到classpath: 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. app/controllers 中的 controllers - 在此处添加您的 controller.scala

  2. conf 中的 application.conf

  3. conf 中的 routes - 添加一个引用步骤1中控制器的路由

执行:sbt run

参考:官方仓库


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接