Documentation

You are viewing the documentation for the 2.2.0 release in the 2.2.x series of releases. The latest stable release series is 2.4.x.

§Play 2.2 移行ガイド

これは Play 2.1 アプリケーションを Play 2.2 へ移行するためのガイドです。 Play 2.0 から移行する場合は、まず Play 2.1 移行ガイド に従ってください。

§ビルドタスク

§Play 組織とバージョンの更新

Play はこれまでと異なる organization id の元に公開されるようになりました。これにより、ようやく Play を Maven Central に配置することができます。古い organization id は play で、新しい id は com.typesafe.play です。

バージョンも 2.2.0 にアップデートする必要があります。

新しい organization id を使って project/plugins.sbt 中の Play プラグインを更新してください:

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

さらに、もし何か Play の artifact に依存するものがあり、ヘルパーを使わずに依存している場合、それらの organization id とバージョン番号を更新する必要があるかもしれません。

§SBT バージョンの更新

sbt 0.13.0 を使うように project/build.properties を更新する必要があります。

§root プロジェクトの更新

sbt のマルチプロジェクトビルドを使っていて、このプロジェクトの root ディレクトリを指定した project が存在しない場合、root プロジェクトはアルファベット順で決められる代わりに、rootProject で上書きして設定することができるようになりました:

override def rootProject = Some(myProject) 

§Scala バージョンの更新

(例えば play.Project に加えて、Project を使うマルチプロジェクトビルドがある場合など) 複数の scalaVersion がある場合、2.10.2 に更新してください。

§Play キャッシュモジュール

Play キャッシュは独自モジュールに切り出されました。Play キャッシュを使っている場合は、依存性として追加する必要があります。例えば、次のように Build.scala に追加します:

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

Play 2.2 以前のバージョンに依存するプラグインに依存している場合、複数のキャッシュ機能がロードされることになるため、衝突が発生することに注意してください。この問題が発生した場合は、プラグインを最新化するか、古いバージョンの Play が確実に除外されるようにしてください。

§Scala における新しい構造の Result

アクション合成とフィルターを簡素化するために、Play の Result 構造はシンプルになりました。以前は SimpleResult, ChunkedResult そして AsyncResult に加えて Result および PlainResult インタフェースがありましたが、Result の型は SimpleResult ただひとつになります。SimpleResult を除いて、すべて非推奨になりました。SimpleResult のサブクラスである Status は、Result を組み立てるために便利であるため、まだ残っています。ほとんどの場合において、アクションは非推奨となった型をまだ使うことができますが、非推奨の警告が表示されるでしょう。合成またはフィルターを行うアクションはどうにかして SimpleResult を使うように切り替える必要があります。

§非同期アクション

以前は次のように書く必要のあったところで:

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

Action.async ビルダを使えるようになります:

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

§チャンクした Result を使う

これまで Status クラスの stream メソッドはチャンクされた Result を生成するために使われました。これは非推奨となり、Result がチャンクされることを明確にする chunked メソッドで置き換えられます。例えば:

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

直接 ChunkedResult を作ったり使ったりする高度な使い方は、手動で TransferEncoding: chunked ヘッダーを設定/チェックし、そして新しい Results.chunkResults.dechunk enumeratee を使うコードで置き換えられるべきです。

§アクション合成

アクションを合成する際は、アクションを組み上げるために実装された ActionBuilder を使うことをお勧めします。

やり方の詳細は ここ で読むことができます。

§フィルタ

EssentialAction により生成される iteratee は、Result の代わりに SimpleResult を生成します。これは Result と動作する必要のあるフィルターは、もう AsyncResultPlainResult にアンラップする必要がないことを意味し、間違いなくすべてのフィルターをシンプルに、そして簡単に書けるようにします。これまでアンラップを行っていたコードは、大抵の場合、map を呼び出すひとつの iteratee で置き換えることができます。

§play.api.http.Writeable の適用

これまで SimpleResult のコンストラクタは Enumerator 型に渡される Writeable を受け取りました。これからは enumerator は Array[Byte] でなければならず、Writeable は便利な Status メソッドのためだけに使われます。

§テスト

これまで Helpers.route() や、その実体は常に AsyncResult である Result を返す同様のメソッド、そして status, header および contentAsString などの Helpers のメソッドは、引数に Result を受け取りました。これからは Helpers.route() から Future[SimpleResult] が返されて、抽出メソッドに受け入れられます。一般的なユースケースとして、型を決定するために型インタフェースが使われている箇所については、テストコードを変更する必要はありません。

§Java における新しい構造の Result

アクションの合成をシンプルにするために、Java の Result 構造 は変更されました。AsyncResult は非推奨になり、通常の Result を AsyncResult 型とはっきり区別するために SimpleResult が導入されました。

§非同期アクション

これまで、非同期アクション内の future は async 呼び出しのなかにラップしなければなりませんでした。これからは、アクションは Result または Promise<Result> のいずれかを返します。例えば:

public static Promise<Result> myAsyncAction() {
    Promise<Integer> promiseOfInt = play.libs.Akka.future(
    new Callable<Integer>() {
      public Integer call() {
        return intensiveComputation();
      }
    }
  );
  return promiseOfInt.map(
    new Function<Integer, Result>() {
      public Result apply(Integer i) {
        return ok("Got result: " + i);
      } 
    }
  );
}

§アクション合成

play.mvc.Action にある call メソッドのシグネチャは Promise<SimpleResult> を返すように変更されました。Result に対してなにもしていない場合に必要となる変更は、通常は型のシグネチャを更新することだけです。

§コンテキストを実行する Iteratee

アプリケーションが提供するコードを実行する iteratee, enumeratee そして enumerator は、暗黙のコンテキストを要求するようになります。例えば:

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 クラスに保持されています。Play 2.1 の古めかしい振る舞いは、F.Promise のあらゆるメソッド引数に OrderedExecutionContext を渡すことで、簡単に再現することができます。

以下に示すのは、Play 2.2 で Play 2.1 の振る舞いを再現するコードです。この例は Play 2.1 と同様の設定を使うことに注意してください。64 個のアクターのプールは Play デフォルトの ActorSystem 内で実行されます。

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 にアップグレードしました。これは、パッケージ名が org.codehaus.jackson ではなく com.fasterxml.jackson.core になることを意味します。

§配布物の準備

stage および dist タスクは Play 2.2 で Native Packager Plugin を使うように完全に書き換えられました。

今後、Play の成果物はプロジェクトの dist フォルダには出力されません。その代わりに、プロジェクトの target フォルダに作成されます。

その他に、Play アプリケーションを起動する Unix スクリプトの場所が変更されています。2.2 以前、この Unix スクリプトは start という名前で配布物フォルダの最上位層に置かれていました。2.2 では、このスクリプトはプロジェクトごとの名前を持ち、配布物の bin フォルダに置かれます。さらに、Windows 上で Play アプリケーションを起動することができる .bat スクリプトもそこに置かれます。

start スクリプトに渡していた引数のフォーマットが変更されていることに注意してください。start スクリプトに -h を渡して、受け付けられる引数を確認してください。

新しい stage および dist タスクのより詳しい情報については、ドキュメント "本番モードでアプリケーションを起動する" を参考にしてください。