在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