Hudson(1.294-SNAPSHOT)の文字化け

久しぶりにtrunkをビルドしてみると、みごとに文字化けしていた。



どうも、Hudson#doCheckURIEncodingが変更されたのが原因のよう。

    public FormValidation doCheckURIEncoding(StaplerRequest request, @QueryParameter String value) throws IOException {
        request.setCharacterEncoding("UTF-8");
        // expected is non-ASCII String
        final String expected = "\u57f7\u4e8b";
        value = fixEmpty(value);
        if (!expected.equals(value))
            return FormValidation.warningWithMarkup(Messages.Hudson_NotUsesUTF8ToDecodeURL());
        return FormValidation.ok();
    }

2つ問題があって、

  1. doCheckURIEncodingは、TomcatのURIEncodingがしっかり設定されているかどうかチェックするもので、GlassFishではチェックされないはずのものなのにチェックに引っかかっている。
  2. 文字ばけ。Ajaxによるレスポンスにcharsetが指定されていない。


1つ目については、クライアントからの文字列をrequest.getparameter()で取得するのではなく、staplerの@QueryParameterで取得するようになったせい?で、request.setCharacterEncoding("UTF-8");が意味のないものになってしまっているのかもしれない。

とりあえず、Glassfish Wiki » FaqHttpRequestParameterEncoding を参考にして、sun-web.xmlを以下のように変更で対処。

<sun-web-app>
  <!-- without this, we end up loading Ant from Glassfish -->
  <class-loader delegate="false"/>
  <locale-charset-info default-locale="">
    <locale-charset-map locale="" charset=""/>
    <parameter-encoding default-charset="UTF-8"/>
  </locale-charset-info>
</sun-web-app>


2つ目は、FormValidation#respondの

rsp.setContentType("text/html");

rsp.setContentType("text/html; charset=UTF-8");

に変更で対処。これで、既存のビューと同じ名前のビューを作成しようとした場合のエラーメッセージの文字化けも直るはず。