Spring mvc@ResponseBody文字化け問題

3593 ワード

Spring MVCで@ResponseBodyを使ってクライアントに中国語のテキスト内容を返すと文字化けが発生する可能性があります.コードフィルタを使っても避けられません.主な原因はSpring MVCで使用されているMessage Coverterがデフォルトで使用しているのはISO-859-1コードです.
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

	public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

	private final Charset defaultCharset;

	private final List<Charset> availableCharsets;

	private boolean writeAcceptCharset = true;
        。。。
        。。。
        public StringHttpMessageConverter() {
		this(DEFAULT_CHARSET);
	}

	/**
	 * A constructor accepting a default charset to use if the requested content
	 * type does not specify one.
	 */
	public StringHttpMessageConverter(Charset defaultCharset) {
		super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
		this.defaultCharset = defaultCharset;
		this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
	}
}
ネット上では通常、自分でコード変換を書くか、あるいはAbstractHttp Message Coverterを引き継ぐタイプを書くか、デフォルトのコードを再定義します.実際には、上記のBeanの有参構造法を直接呼び出してインスタンスを作成し、私たちが必要とするコードを送信するCharsetオブジェクトを送ればいいです.しかし、Charrset類には利用可能なコンストラクタがなく、一つの静的forName方法でオブジェクトを作成するしかないです.これは、静的な工場法を使用してbeanを作成するのと同じですので、以下のような構成にすればいいです.
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="messageConverters">
        <list> 
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            	<constructor-arg>
            		<bean id="defaultCharset" class="java.nio.charset.Charset" factory-method="forName">
            			<constructor-arg value="UTF-8"/>
            		</bean>
            	</constructor-arg>  
                <property name="supportedMediaTypes">  
                    <list>  
                        <bean class="org.springframework.http.MediaType">  
                            <constructor-arg index="0" value="text" />  
                            <constructor-arg index="1" value="plain" />  
                            <constructor-arg index="2" value="UTF-8" />  
                        </bean>  
                        <bean class="org.springframework.http.MediaType">  
                              <constructor-arg index="0" value="application"/>  
			      <constructor-arg index="1" value="json"/>  
			      <constructor-arg index="2" value="UTF-8"/> 
                    	</bean> 
                    </list> 
                     
                </property>  
            </bean>
            
        </list>  
     </property> 
</bean>
 
 
        ここで使っているのは
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
 ,spring mvc 3.1以前のバージョンでは、
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
.