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
。