簡體   English   中英

將現有的 SBT Scala 應用程序轉換為 Play

[英]Convert existing SBT Scala application to Play

我一直在用 Akka actor 構建一個應用程序,現在我已經完成了基於 actor 的業務邏輯,我想給它一個 RESTful + websocket 前端。 我正在嘗試查找有關如何在現有應用程序的上下文中設置 Play 的說明。 我能找到的唯一說明是如何創建新的 Play 應用程序。 有沒有關於如何做到這一點的文件?

更新:這個問題更多地與 SBT 設置有關,而不是將控制器連接到我的基於演員的業務邏輯。 我試圖修改build.sbtplugins.sbt以包含當我執行activator new但 IDEA 抱怨Cannot resolve symbol PlayScala時激活器構建的東西。 此外,我想知道如何將我的演員從 SBT 標准src/main/scalaapp/ —— 它應該在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")

更新答案:

在您的項目文件中啟動activator然后使用run啟動 Web 應用程序並使用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包。

一個部分是將您的業務層(基於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 請求轉換為操作調用(控制器類中的公共方法)。
  • 控制器包含一些操作。
  • 一個動作在你的業務層(你的演員系統)中做一些工作並返回一個結果

現在定義一些路由請求路徑:

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

對項目的以下更改幫助我將 PlayFramework(版本:2.8.1)應用到現有項目中:

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

  2. build.sbt中將以下build.sbt添加到libraryDependencies : "com.typesafe.play" %% "play" % playVersion

    2.1:在libraryDependencies ++= Seq(guice)添加guice支持

    2.2:添加以下內容以將/src包含到類路徑中: unmanagedSourceDirectories in Compile += baseDirectory.value / "src"

  3. 添加/src目錄以將其添加到類路徑並驗證:

[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. controllersapp/controllers -添加controller.scala這里

  2. conf application.conf

  3. routesconf -添加,指的控制器上步驟-1的路徑

執行: sbt run

參考: 官方repo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM