JerseyMVC + Thymeleafで表示されたHTMLが文字化けしたら・・・

【前提条件】

[環境]
[参考資料]

JerseyMVC Template
Jersey

【概要】

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時間くらい悩んだのでメモとして残しておきました。