ThymeleafのTemplateResolverとキャラクターセット
種々の思惑からこのかんThymeleafを使用したコマンドライン・ツールを作っていて、その中で1つ発見した──というか遭遇した問題。
Thymeleafのテンプレート・エンジンは基本的にWebアプリケーションに組み込んで使うことを想定しているけれど、そうでない用途にも使うことができる。その方法についてはすでにこのブログ上でも取り上げている。
しかし例えば異なるOSでも実行可能なJARファイルをつくるという場合、TemplateResolver
インターフェースを通じて、次のようにキャラクターセット(エンコーディング)の設定をする必要がある:
import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; import org.thymeleaf.templateresolver.TemplateResolver; (...) // テンプレート・エンジンをインスタンス化 final TemplateEngine engine = new TemplateEngine(); // テンプレート解決子をインスタンス化 final TemplateResolver resolver = new ClassLoaderTemplateResolver(); // 種々の設定を行う resolver.setPrefix("..."); resolver.setSuffix("..."); resolver.setTemplateMode("..."); resolver.setCharacterEncoding("utf-8"); // テンプレート解決子をエンジンに設定 engine.setTemplateResolver(resolver);
これを怠ると、例えば「Mac OS X上で開発しているときにはmainクラスを直接指定するかたちでもJARファイルを指定するかたちでもちゃんと動いていたけれど、Windowsで実行するとSAXのエラーが表示される」という事態が発生する。
つまりTemplateResolver
はデフォルトではJava VMがデフォルトのキャラクターセットとして指定したものを採用するので、もしテンプレート・ファイルにマルチ・バイト文字が含まれているのであれば、明示的にキャラクターセット(エンコーディング)を指定する必要があるということ。