文档

§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(例如,因为您有多项目构建,它除了 play.Project 之外还使用 Project),则应将其更新为 2.10.2。

§Play 缓存模块

Play 缓存现在已拆分为自己的模块。如果您使用的是 Play 缓存,则需要将其添加为依赖项。例如,在 Build.scala

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

请注意,如果您依赖于依赖于 Play 2.2 之前版本的插件,则由于加载了多个缓存,因此缓存中会出现冲突。如果您看到此问题,请更新到更高版本的插件或确保排除旧版本的 Play。

§sbt 命名空间不再扩展

以前,Play 扩展了 sbt 命名空间,例如 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 的构造函数接受一个 Writeable,用于传递给它的 Enumerator 的类型。现在,该枚举器必须是 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>。如果对结果不做任何处理,则通常只需要更新类型签名即可。

§Iteratees 执行上下文

执行应用程序提供的代码的 Iteratees、enumeratees 和 enumerators 现在需要一个隐式执行上下文。例如

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

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

§并发 F.Promise 执行

Play 2.2 中,F.Promise 类执行用户提供的代码的方式发生了变化。

在 Play 2.1 中,F.Promise 类限制了用户代码的执行方式。对于给定 HTTP 请求的 Promise 操作将按照提交顺序执行,本质上是顺序执行。

在 Play 2.2 中,此顺序限制已删除,因此 Promise 操作可以并发执行。F.Promise 类执行的工作现在使用 Play 的默认线程池,而不会对执行施加任何其他限制。

但是,对于仍然想要使用 Play 2.1 的遗留行为的用户,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 Plugin

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


在此文档中发现错误?此页面的源代码可以在 这里 找到。在阅读 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?转到 我们的社区论坛 与社区开始对话。