Spring MVC中默認的ResponseBody爲String的亂碼問題

在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

相關文章
相關標籤/搜索