[play1] テンプレート処理結果を文字列で見たい

  playframework1

play1のrenderメソッドは巧みに隠されていますが、Resultクラスを継承したランタイム例外を投げるようになっています。

こうした実装により、コントローラ処理での終わり方を意識することなく、バッサリ終わらせるような記述ができ、本来のコーディングに集中できるようになっています。

ということで私はrenderメソッドで例外が投げられることは知っていたので、これを捕捉すればテンプレート処理した結果を簡単に見られると思っていましたが、どうもそう簡単にはいかないようで。。

try {
    render();
} catch (RenderTemplate result) {
    Logger.info("html=%s", result.getContent());
    throw result;
}

このようなコードを書いてみたのですが、例外が捕捉されることはありませんでした。(ページはちゃんと表示される)

play1ではapp配下を自前でコンパイルしています。その際に便利になるようにコードに少しだけ変更を加えています。それを担っているのが play.classloading.enhancers.Enhancer を継承したクラス群です。

今回は play.classloading.enhancers.ControllersEnhancer クラスが働いて、play.mvc.results.Resultplay.Invoker.Suspend を継承したクラスがキャッチされると即再スローするコードを埋め込んでいるようでした。
ユーザのコードが実行される前に再スローしてしまうために捕捉に失敗しているように見えていた、と。

そんなわけで例外オブジェクトが投げられる直前の処理を抜き出せば、テンプレート処理した結果を文字列でゲットできました。

Template template = TemplateLoader.load(template("Application/index.html"));
String html = template.render(renderArgs.data);
Logger.info("html=%s", html);

省略していますが、テンプレート内で params session などのオブジェクトを参照している場合は、renderArgs.dataにそれらも追加する必要があります。

詳しくは play.mvc.Controller.renderTemplate(String, Map) の実装を見てみてください。

LEAVE A COMMENT