JerseyMVC + Thymeleafで表示されたHTMLが文字化けしたら・・・
【概要】
JerseyMVCとThymeleafを組み合わせた時に表示された結果が文字化けした時の対応です。
今までブログで書いていたサンプルだとマルチバイト文字が
文字化けしてしまうやり方だったようなので、
文字化けした場合の対応方法について書きます。
【TemplateProcessor】
文字コードの設定はTemplateProcessor内で行います。
@Provider public class ThymeleafViewProcessor implements TemplateProcessor<String> { @Context private HttpServletRequest request; @Context private HttpServletResponse response; @Context private ServletContext servletContext; private final TemplateEngine templateEngine; public ThymeleafViewProcessor() { TemplateResolver resolver = new ServletContextTemplateResolver(); resolver.setPrefix("/WEB-INF/view/"); resolver.setSuffix(".html"); resolver.setTemplateMode("HTML5"); resolver.setCacheTTLMs(3600000L); resolver.setCharacterEncoding("UTF-8"); templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(resolver); } @Override public String resolve(String name, MediaType mediaType) { return name; } @Override public void writeTo(String templateReference, Viewable viewable, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream out) throws IOException { WebContext context = new WebContext(request, response, servletContext); context.setVariable("it", viewable.getModel()); Writer writer = new OutputStreamWriter(out, "UTF-8"); templateEngine.process(templateReference, context, writer); writer.flush(); } }
設定する箇所としては二箇所です。
TemplateResolverに対してsetCharacterEncodingを使って文字コードを設定します。
もう一箇所はwriteToで渡されたOuputStreamに対して設定します。
【まとめ】
書いて見て改めて思いますが、「それは設定しないと上手くいかないよね」感がすごい・・・
私は1時間くらい悩んだのでメモとして残しておきました。