Spring mvc @ResponseBody乱码问题

Spring MVC中使用@ResponseBody向客户端返回含有中文的文本内容的时候,可能会出现乱码,即使已经使用编码过滤器,也不能避免。主要原因是Spring MVC使用的MessageConverter默认使用的是ISO-8859-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());
	}
}

网上通常的做法要么自己写代码转换,要么是写一个类继承 AbstractHttpMessageConverter,重新定义默认编码。其实我们可以直接调用上述Bean的有参构造方法来创建实例,然后给传一个我们需要的编码的Charset对象即可。但是Charset类没有可用的构造器,只能通过一个静态的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

猜你喜欢

转载自shidan66.iteye.com/blog/2005304