seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

Jersey 1.x の Content-Type に charset を指定する

Jersey 1.x の話です(2.x はまだ出てないですが、この記事が古くなってしまうことも想定して)。

通常は「@Produces(MediaType.APPLICATION_JSON)」だけだと「;charset=UTF-8」のような文字コード指定はつかないのでちょっと不便です。「@Produces("application/json;charset=UTF-8")」のように文字列で直接指定すればいいのですが、それもどうかということで。

対応方法は、ここにあるままなのですが

http://stackoverflow.com/questions/5514087/jersey-rest-default-character-encoding

package com.example.jaxrs.containerfilter;

import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;

import javax.ws.rs.core.MediaType;

public class CharsetResponseFilter implements ContainerResponseFilter {

    @Override
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
        MediaType contentType = response.getMediaType();
        if (contentType == null) {
            // 指定しない場合は null になっているのでデフォルトの Content-Type を指定するなりそのまま null にするなりの対応をする
            response.getHttpHeaders().putSingle("Content-Type", "application/xml;charset=UTF-8");
        } else if (!contentType.toString().contains(";charset=") ) {
            // 自前で設定したい場合もあるかと思うのでその場合は何もしない
            response.getHttpHeaders().putSingle("Content-Type", contentType.toString() + ";charset=UTF-8");
        }
        return response;
    }

}

web.xml に以下のような感じで指定するだけ。

    <!-- Jersey with Spring -->
    <filter>
        <filter-name>Jersey with Spring</filter-name>
        <filter-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</filter-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.example.resource,org.codehaus.jackson.jaxrs</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
            <param-value>
                com.example.jaxrs.containerfilter.CharsetResponseFilter
            </param-value>
        </init-param>
    </filter>