Spring MVC中默认的ResponseBody为String的乱码问
2016-08-30 10:41
211 查看
在Spring的MVC中,如果你使用的是中文,用的是UTF-8编码,有的时候我们会直接返回一个文本给前端的AJAX调用。Controllor中的代码如下:
Java代码
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() {
return"中文测试";
}
这时发现响应出来的是乱码。原因是Spring会采用默认的StringHttpMessageConverter类来进行String类型的响应处理。查看源码发现,这个类莫名其妙的把响应的编码写死了,这样就产生了乱码问题。其中有句代码是:
Java代码
publicstaticfinal Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
解决方法:
想到的方法是采用BeanPostProcessor,在Spring初始化好StringHttpMessageConverter之后进行修改响应类型。好在该类提供了setSupportedMediaTypes方法可以进行设置。所以实现的代码如下:
Java代码
publicclass 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 types = new ArrayList();
types.add(mediaType);
types.add(MediaType.ALL);
((StringHttpMessageConverter) bean).setSupportedMediaTypes(types);
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
然后在配置文件上加入:
Xml代码
< span>beans:beanclass="com.walmart.bestsales.util.UTF8StringBeanPostProcessor"<</>beans:bean<
这样就成功实现了UTF8编码的输出。
小结:采用BeanPostProcessor实现的好处就是不对已有的代码做修改,如果以后升级Spring也容易进行兼容。在国际化的大环境下,默认值至少也应该是UTF-8呀。
Java代码
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() {
return"中文测试";
}
这时发现响应出来的是乱码。原因是Spring会采用默认的StringHttpMessageConverter类来进行String类型的响应处理。查看源码发现,这个类莫名其妙的把响应的编码写死了,这样就产生了乱码问题。其中有句代码是:
Java代码
publicstaticfinal Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
解决方法:
想到的方法是采用BeanPostProcessor,在Spring初始化好StringHttpMessageConverter之后进行修改响应类型。好在该类提供了setSupportedMediaTypes方法可以进行设置。所以实现的代码如下:
Java代码
publicclass 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 types = new ArrayList();
types.add(mediaType);
types.add(MediaType.ALL);
((StringHttpMessageConverter) bean).setSupportedMediaTypes(types);
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
然后在配置文件上加入:
Xml代码
< span>beans:beanclass="com.walmart.bestsales.util.UTF8StringBeanPostProcessor"<</>beans:bean<
这样就成功实现了UTF8编码的输出。
小结:采用BeanPostProcessor实现的好处就是不对已有的代码做修改,如果以后升级Spring也容易进行兼容。在国际化的大环境下,默认值至少也应该是UTF-8呀。
相关文章推荐
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Spring MVC中默认的ResponseBody为String的乱码问
- Refresh SVN status cache
- ADB server didn't ACK问题解决办法
- java环境配置
- java环境配置
- java环境配置
- java环境配置
- java环境配置