QA@IT

Play Framework 2 のデフォルトエラーページのOverrideができない

4169 PV

play framework2.3.6にてWebアプリを作っています。
例外発生時のデフォルトエラーページをカスタマイズしようとし、"app/views/errorpage.scala.html"を作成、以下の内容をGlobal.javaに記述し、例外を発生させてみました。

その結果、自分で用意したエラーページが表示されるのではなく、(おそらく)PlayFramework2デフォルトのエラーページが表示されてしまいます(errorという文字列のみのページ)。

        @Override
        public Promise<Result> onError(RequestHeader request, Throwable t) {
                return Promise.<Result> pure(internalServerError(errorpage.render("fatal error")));
        }

なお、以下の部分を正常系の中に記述してみて実行すると、テンプレートが読み込まれてエラーページが表示されるため、テンプレートがおかしい、などということではなさそうです。

internalServerError(errorpage.render("fatal error")

また、Global.javaに記述した、onStart, onStopは動作しているため、Global.javaそれ自体が読み込まれていない、ということもないようです。

回答

参考までに、Play 2.3.6で同様に試してみましたが指定したエラーページが表示されました。

  • "app/views/index.scala.html" を コピーして "app/views/errorpage.scala.html"を作成。
  • application.conf の global設定のコメントアウト解除
  • app/Global.java を作成
  • index() で適当に例外を起こす(String s = null; s.toString();)

onErrorが呼び出されていない(実はエラーが発生していない)という可能性がありそうですので、
onErrorメソッド内でさらにエラーが起こるようにしてみてログにどうでるか確認してはどうでしょうか。
※ その場合私の環境では unexpected exception というページが表示されます(Compile Error時に似た画面)。

Global.java

import play.*;
import play.mvc.*;
import play.mvc.Http.*;
import play.libs.F.*;
import static play.mvc.Results.*;
import views.html.*;

public class Global extends GlobalSettings {

  @Override
  public Promise<Result> onError(RequestHeader request, Throwable t) {
    return Promise.<Result> pure(internalServerError(errorpage.render("fatal error")));
  }
}
編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。