在Spring的MVC中,若是你使用的是中文,用的是UTF-8编码,有的时候咱们会直接返回一个文本给前端的AJAX调用。Controllor中的代码以下: 前端
@ResponseBody @RequestMapping(value = "/test", method = RequestMethod.GET) public String test() { return "中文测试"; }
这时发现响应出来的是乱码。缘由是Spring会采用默认的StringHttpMessageConverter类来进行String类型的响应处理。查看源码发现,这个类莫名其妙的把响应的编码写死了,这样就产生了乱码问题。其中有句代码是: java
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
解决方法: app
1. 想到的方法是采用BeanPostProcessor,在Spring初始化好StringHttpMessageConverter以后进行修改响应类型。好在该类提供了setSupportedMediaTypes方法能够进行设置。因此实现的代码以下: ide
public class UTF8StringBeanPostProcessor implements BeanPostProcessor{ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(bean instanceof StringHttpMessageConverter){ MediaType mediaType = new MediaType("text", "plain", Charset.forName("UTF-8")); List<MediaType> types = new ArrayList<MediaType>(); types.add(mediaType); ((StringHttpMessageConverter) bean).setSupportedMediaTypes(types); } return bean; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } }
而后在配置文件上加入: post
<beans:bean class="com.walmart.bestsales.util.UTF8StringBeanPostProcessor"></beans:bean>
这样就成功实现了UTF8编码的输出。 测试
2. 若是以上方法不能解决问题,还能够尝试如下方法(在Controller方法上添加): 编码
@RequestMapping(value="/XXX/XX", produces="text/plain;charset=utf-8")
小结:采用BeanPostProcessor实现的好处就是不对已有的代码作修改,若是之后升级Spring也容易进行兼容。在国际化的大环境下,默认值至少也应该是UTF-8呀。 spa