LoginSignup
19
19

More than 5 years have passed since last update.

Play2.4 -> Play2.5に移行する方法と解決したエラーたち

Last updated at Posted at 2016-03-06

移行方法

以下の二つを書き換える

  • project/build.properties
    sbt.version=0.13.8

    sbt.version=0.13.11

  • project/plugins.sbt
    addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.6")

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

終わったらactivator eclipseとして、2.5に更新すると共にプロジェクトファイルも同時に一新する
(Eclipseじゃない人はactivator updateやactivator runで良さそう)

すると非推奨パッケージとコンパイルエラーが出るわ出るわ

コンパイル時のエラーを直す

エラー: 不適合な型: ObjectをFileに変換できません:

  • File file = picture.getFile();

どうやらplay.mvc.Http.MultipartFormDataと
play.mvc.Http.MultipartFormData.FilePartにはジェネリックスが付くようになったらしい

MultipartFormData body = request().body().asMultipartFormData();
FilePart picture = body.getFile("picture");

↓修正

MultipartFormData<File> body = request().body().asMultipartFormData();
FilePart<File> picture = body.getFile("picture");

エラー: DynamicFormに適切なコンストラクタが見つかりません(引数がありません)

  • DynamicForm form = new DynamicForm().bindFromRequest();

Formはファクトリーメソッドを使って作るようになった模様
DynamicFormを作るにはFormFactoryのform()を引数なしで呼べば良い

1. コントローラーにFormFactoryとInjectをインポート

import javax.inject.Inject;
import play.data.FormFactory;

2. コントローラーにフィールド追加

@Inject
FormFactory formFactory;

3. フォーム部分を書き換え
DynamicForm requestData = formFactory.form().bindFromRequest();

CSRF Filters

  • エラー: Filtersはabstractでなく、HttpFilters内のabstractメソッドfilters()をオーバーライドしません
  • エラー: Filtersのfilters()はHttpFiltersのfilters()を実装できません
  • 戻り値の型play.api.mvc.EssentialFilter[]はplay.mvc.EssentialFilter[]と互換性がありません
  • エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません

恐れることなくフィルタークラスを変更

import play.http.HttpFilters;
import play.api.mvc.EssentialFilter; // ←☆
import play.filters.csrf.CSRFFilter;
import javax.inject.Inject;

public class Filters implements HttpFilters {

    @Inject CSRFFilter csrfFilter;

    @Override
    public EssentialFilter[] filters() {
        return new EssentialFilter[] { csrfFilter }; // ←☆
    }
}

import play.http.HttpFilters;
import play.mvc.EssentialFilter; // ←☆
import play.filters.csrf.CSRFFilter;
import javax.inject.Inject;

public class Filters implements HttpFilters {

    @Inject CSRFFilter csrfFilter;

    @Override
    public EssentialFilter[] filters() {
        return new EssentialFilter[] { csrfFilter.asJava() }; // ←☆
    }
}

非推奨パッケージの置き換え

play.cache.Cache → play.cache.CacheApi

1.コントローラーにフィールド追加

@Inject
CacheApi cache;

2.CacheApiを使うように変更
Cache.set(token, info, 60 * 60);

cache.set(token, info, 60 * 60);

ViewでCacheを使ってる場合

Viewの引数にコントローラーでInjectしたフィールドを渡せば良いらしい

1.コントローラーにCacheApiのフィールド追加

@Inject
CacheApi cache;

2.ViewにCacheApiをインポート
@import play.cache.CacheApi

3.Viewのテンプレート引数にCacheApiを追加
@(user: models.entity.User, cache: CacheApi)

4.ViewでCacheApiを使うように変更
Cache.get(session.get("userToken"))

cache.get(session.get("userToken"))

5.コントローラーのレンダリング部分を修正
return ok(user.render(userOps.get(), cache));

play.Routes → play.routing.JavaScriptReverseRouter

1.コントローラーにplay.routing.JavaScriptReverseRouterをインポート
import play.routing.JavaScriptReverseRouter;

2.JavaScriptのルーティング部分を書き換え

public Result getJSRoutes() {
    return ok(Routes.javascriptRouter("jsRoutes",
    controllers.routes.javascript.FooController.bar()));
}

public Result getJSRoutes() {
    return ok(JavaScriptReverseRouter.create("jsRoutes",
    controllers.routes.javascript.FooController.bar()));
}

移行に役立つと思われるリンク

公式を見れば大体解決する!

19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19