不推荐的方式:
在spring mvc中,@ResponseBody返回的默认编码为ISO-8859-1,但是实际需要的是UTF-8,所以需要转换,添加produces = "application/json; charset=utf-8",如下所示
@RequestMapping(value = "/select",produces = "application/json; charset=utf-8")
@ResponseBody
public String getSelectTagByCategory(@RequestParam Map<String,String> data) {
StringBuffer sb = new StringBuffer();
return sb.toString();
}
这样做虽然可以解决,不过每个接口都要加,不太可能;
推荐方式
在spring处理ResponseBody时涉及到org.springframework.http.converter.StringHttpMessageConverter这个类,该类在默认实现中将defaultCharset设为ISO-8859-1。当@RequestMapping标记的方法未配置produces属性时,将自动使用默认编码;如果配置了produces属性,AbstractHttpMessageConverter中的write方法将不会受supportedMediaTypes影响,而用produce设置的header赋值给contenttype。改造一下RequestMappingHandlerAdapter的配置,springMvc.xml如下:
注意:基于spring3.2以后的配置文件。编码配置需要放在<mvc:annotation-driven/>之前,否则无效
<!-- 必须放在<mvc:annotation-driven>之前 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>applicaiton/javascript;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
上述springMvc.xml文件重新设置了StringHttpMessageConverter的编码方式,而不必在每个@RequestMapping里设置produces属性。如果返回的Jackson类型的数据,可以设置成如下:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json; charset=UTF-8</value>
<value>application/x-www-form-urlencoded; charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
亲测有效;
如果无效也可能是其它问题造成的,这里是针对 Client;