文件

§Play 2.2 遷移指南

這是從 Play 2.1 遷移至 Play 2.2 的指南。如果您需要從 Play 的較早版本進行遷移,則必須先遵循 Play 2.1 遷移指南

§建置任務

§更新 Play 組織和版本

Play 現在已在不同的組織 ID 下發布。這是為了讓我們最終能將 Play 部署到 Maven Central。舊的組織 ID 為 play,新的組織 ID 為 com.typesafe.play

版本也必須更新為 2.2.0。

project/plugins.sbt 中,更新 Play 外掛以使用新的組織 ID

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.0")

此外,如果您對 Play 人工製品有任何其他依賴項,而且您沒有使用輔助程式來依賴它們,您可能必須更新那裡的組織和版本號碼。

§更新 sbt 版本

project/build.properties 必須更新為使用 sbt 0.13.0。

§更新根目錄專案

如果您正在使用多專案建置,而且沒有任何專案的根目錄為目前的目錄,則根目錄專案現在會透過覆寫 rootProject 來決定,而不是依字母順序

override def rootProject = Some(myProject) 

§更新 Scala 版本

如果您已設定 scalaVersion(例如,因為您有一個多專案建置,它使用 Project 以及 play.Project),您應該將它更新為 2.10.2。

§Play 快取模組

Play 快取現在已拆分為其自己的模組。如果您正在使用 Play 快取,您需要將它新增為依賴項。例如,在 Build.scala

val addDependencies = Seq(
  jdbc,
  cache,
  ...
)

請注意,如果您依賴於依賴於 2.2 之前 Play 版本的外掛,則會因為載入多個快取而導致快取內部發生衝突。如果您看到這個問題,請更新到較新的外掛版本或確保已排除較舊的 Play 版本。

§sbt 名稱空間不再延伸

sbt 名稱空間以前是由 Play 延伸的,例如 sbt.PlayCommands.intellijCommandSettings。這被認為是不良做法,因此
Play 現在使用自己的命名空間來處理 sbt 相關事項,例如 play.PlayProject.intellijCommandSettings

§Scala 中的新結果結構

為了簡化動作組成和篩選,Play 結果結構已簡化。現在只有一個結果類型,SimpleResult,之前有 SimpleResultChunkedResultAsyncResult,加上介面 ResultPlainResult。除了 SimpleResult 之外,所有其他類型都已棄用。StatusSimpleResult 的子類別,仍然存在作為建構結果的便利類別。在大部分情況下,動作仍然可以使用已棄用的類型,但會收到棄用警告。然而,執行組成和篩選的動作必須切換為使用 SimpleResult

§非同步動作

之前,您可能會有以下程式碼

def asyncAction = Action {
  Async {
    Future(someExpensiveComputation)
  }
}

現在可以使用 Action.async 建構函式

def asyncAction = Action.async {
  Future(someExpensiveComputation)
}

§處理分塊結果

之前,Status 上的 stream 方法用於產生分塊結果。這已被棄用,並替換為 chunked 方法,清楚說明結果將會分塊。例如

def cometAction = Action {
  Ok.chunked(Enumerator("a", "b", "c") &> Comet(callback = "parent.cometMessage"))
}

直接建立或使用 ChunkedResult 的進階用法應替換為手動設定/檢查 TransferEncoding: chunked 標頭,並使用新的 Results.chunkResults.dechunk 列舉的程式碼。

§動作組成

我們現在建議使用 ActionBuilder 實作來建立動作,以完成動作組合。

有關如何執行的詳細資訊,請參閱 此處

§篩選器

EssentialAction 所產生的迭代器現在產生 SimpleResult,而非 Result。這表示需要使用結果的篩選器不再需要將 AsyncResult 解包成 PlainResult,這可說讓所有篩選器更為簡單且容易撰寫。先前進行解包的程式碼通常可以用單一迭代器 map 呼叫取代。

§play.api.http.Writeable 應用程式

先前 SimpleResult 的建構函式會針對傳遞給它的 Enumerator 類型取得 Writeable。現在該列舉器必須是 Array[Byte],而 Writeable 僅用於 Status 方便方法。

§測試

先前 Helpers.route() 和類似方法會傳回 Result,這永遠會是 AsyncResult,而 Helpers 上的其他方法,例如 statusheadercontentAsString,會將 Result 作為參數。現在 Helpers.route() 會傳回 Future[SimpleResult],並由擷取方法接受。對於許多常見的用例,其中會使用類型推論來判斷類型,測試程式碼不應需要變更。

§Java 中的新結果結構

為了簡化動作組合,Java 的結果結構已變更。AsyncResult 已棄用,而 SimpleResult 已導入,以區別一般結果與 AsyncResult 類型。

§非同步動作

先前,非同步動作中的未來必須包覆在 async 呼叫中。現在動作可以傳回 ResultPromise<Result>。例如

public static Promise<Result> myAsyncAction() {
  Promise<Integer> promiseOfInt = Promise.promise(
    new Function0<Integer>() {
      public Integer apply() {
        return intensiveComputation();
      }
    }
  );
  return promiseOfInt.map(
    new Function<Integer, Result>() {
      public Result apply(Integer i) {
        return ok("Got result: " + i);
      }
    }
  );
}

§動作組成

play.mvc.Actioncall 方法的簽章已變更,現在回傳 Promise<SimpleResult>。如果沒有對結果做任何事,通常唯一的必要變更就是更新類型簽章。

§Iteratee 執行內容

現在,執行應用程式提供程式碼的 Iteratee、列舉器和枚舉器需要一個暗示執行內容。例如

import play.api.libs.concurrent.Execution.Implicits._

Iteratee.foreach[String] { msg =>
  println(msg)
}

§並發 F.Promise 執行

F.Promise 類別執行使用者提供的程式碼的方式已在 Play 2.2 中變更。

在 Play 2.1 中,F.Promise 類別限制使用者程式碼的執行方式。特定 HTTP 要求的 Promise 作業會按照提交順序執行,基本上是循序執行。

在 Play 2.2 中,已移除這個排序限制,因此 Promise 作業可以並發執行。F.Promise 類別執行的作業現在使用 Play 的預設執行緒池,不會對執行加上任何其他限制。

不過,對於仍然需要的人,Play 2.1 的舊有行為已擷取到 OrderedExecutionContext 類別中。只要將 OrderedExecutionContext 提供為 F.Promise 的任何方法的引數,就可以輕鬆重建 Play 2.1 的舊有行為。

以下程式碼顯示如何在 Play 2.2 中重建 Play 2.1 的行為。請注意,這個範例使用與 Play 2.1 相同的設定:在 Play 的預設 ActorSystem 中執行的 64 個 Actor 池。

import play.core.j.OrderedExecutionContext;
import play.libs.Akka;
import play.libs.F.*;
import scala.concurrent.ExecutionContext;

ExecutionContext orderedExecutionContext = new OrderedExecutionContext(Akka.system(), 64);
Promise<Double> pi = Promise.promise(new Function0<Double>() {
  Double apply() {
    return Math.PI;
  }
}, orderedExecutionContext);
Promise<Double> mappedPi = pi.map(new Function<Double, Double>() {
  Double apply(x Double) {
    return 2 * x;
  }
}, orderedExecutionContext);

§Jackson Json

我們已將 Jackson 升級到版本 2,這表示套件名稱現在是 com.fasterxml.jackson.core,而不是 org.codehaus.jackson

§準備發行版

stagedist 任務已在 Play 2.2 中完全重新編寫,以便使用 Native Packager 外掛程式

Play 發行版不再建立在專案的 dist 資料夾中。它們會建立在專案的 target 資料夾中。

另一個已變更的項目是啟動 Play 應用程式的 Unix 腳本位置。在 2.2 之前,Unix 腳本名稱為 start,且位於發行版的根目錄資料夾中。在 2.2 中,start 腳本會根據專案名稱命名,且位於發行版的 bin 資料夾中。此外,現在有一個 .bat 腳本可供在 Windows 上啟動 Play 應用程式。

請注意,傳遞給 start 腳本的引數格式已變更。請在 start 腳本上執行 -h,以查看現在接受的引數。

請參閱 "在生產模式中啟動應用程式" 文件,以取得有關新的 stagedist 任務的更多資訊。

§從 Akka 2.1 升級到 2.2

從 Akka 2.1 升級到 2.2 的遷移指南可以在 此處 找到。

下一步:Play 2.1


在此文件中找到錯誤?此頁面的原始程式碼可以在 此處 找到。在閱讀 文件指南 後,請隨時提交拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇,與社群展開對話。