Spring MVC中默认的ResponseBody为String的乱码问题

个人技术博客:http://demi-panda.com

 

在Spring的MVC中,如果你使用的是中文,用的是UTF-8编码,有的时候我们会直接返回一个文本给前端的AJAX调用。Contr ollor中的代码如下:

@ResponseBody @RequestMapping(value = "/test", method = RequestMethod.GET) public String test() { return "中文测试"; }

 这时发现响应出来的是乱码。原因是Spring会采用默认的StringHttpMessageConverter类来进行String类型的响应处理。查看源码发现,这个类莫名其妙的把响应的编码写死了,这样就产生了乱码问题。其中有句代码是:

public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

 想到的方法是采用BeanPostProcessor,在Spring初始化好StringHttpMessageConverter之后进行修改响应类型。好在该类提供了setSupported MediaTypes方法可以进行设置。所以实现的代码如下:

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;
  }
}

 然后在配置文件上加入:

<bean class="com.tuan.geo.service.impl.UTF8StringBeanPostProcessor"/>

 

小结:采用BeanPostProcessor实现的好处就是不对已有的代码做修改,如果以后升级Spring也容易进行兼容。在国际化的大环境下,默认值至少也应该是UTF-8呀。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值