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>