Tapestry5で日本語を使う方法

7/10追記: Tapestry5.0.5から、ここに書いたようなことをしなくても日本語を扱えるようになりました → http://d.hatena.ne.jp/butyricacid/20070710/1184016763


Tapestry5はまだまだ開発途中ということもあってか、そのままでは日本語が使えないようです。テンプレート自体はencoding指定したXML宣言を書けばそのencodingで読んでくてるようなのですが、レスポンスを出力するときに ContentType=text/html で固定されちゃっててcharsetの指定ができない。

少し調べてみた所 AppModule.java に以下のメソッドを追加すればOKみたい。

@Match("PageResponseRenderer")
public static PageResponseRenderer decoratePageResponseRenderer(
		@InjectService("PageMarkupRenderer")
		final PageMarkupRenderer markupRenderer,
		@InjectService("MarkupWriterFactory")
		final MarkupWriterFactory markupWriterFactory,
		final Object delegate) {

	return new PageResponseRenderer() {
		public void renderPageResponse(Page page, Response response) throws IOException {
			MarkupWriter writer = markupWriterFactory.newMarkupWriter();
			markupRenderer.renderPageMarkup(page, writer);
			PrintWriter pw = response.getPrintWriter("text/html; charset=EUC-JP");
			writer.toMarkup(pw);
			pw.flush();
		}
	};
}

http://tapestry.apache.org/tapestry5/tapestry-ioc/decorator.html を見ながら適当に試してみたらうまくいったんだけど、デコレーションといいながら(final Object delegate に渡されてくる)元のPageResponseRendererを捨てちゃってるのが少し気になる。もっと適切な方法があるのかもしれないな。