首页 > 代码库 > Spring mvc responsebody 中文乱码问题
Spring mvc responsebody 中文乱码问题
spring mvc在3.0中引入了responsebody这个注解,但是在源码中StringHttpMessageConverter 将默认编码写成了ISO-8859-1,并且是static final的,从网上搜了一堆,通过配置注入来解决,但是都是3.1的解决办法;看来只能通过重写+注入解决了,果然在网上搜到了一个贴了,试了下,可行~ 以下是帖子的一段~
@ResponseBody默认采取
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
的方式,我要修改为UTF-8,所以,就直接copy了源码,但是修改了一下里边的默认编码
import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.util.FileCopyUtils; /** * @Author : wangxl * @Date : 2013-1-17 */ public class UTF8StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private final List<Charset> availableCharsets; private boolean writeAcceptCharset = true; public UTF8StringHttpMessageConverter() { super(new MediaType[] { new MediaType("text", "plain", UTF8StringHttpMessageConverter.DEFAULT_CHARSET), MediaType.ALL }); this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets() .values()); } public void setWriteAcceptCharset(boolean writeAcceptCharset) { this.writeAcceptCharset = writeAcceptCharset; } public boolean supports(Class<?> clazz) { return String.class.equals(clazz); } @SuppressWarnings("rawtypes") protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException { Charset charset = getContentTypeCharset(inputMessage.getHeaders() .getContentType()); return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset)); } protected Long getContentLength(String s, MediaType contentType) { Charset charset = getContentTypeCharset(contentType); try { return Long.valueOf(s.getBytes(charset.name()).length); } catch (UnsupportedEncodingException ex) { throw new InternalError(ex.getMessage()); } } protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException { if (this.writeAcceptCharset) { outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); } Charset charset = getContentTypeCharset(outputMessage.getHeaders() .getContentType()); FileCopyUtils.copy(s, new OutputStreamWriter( outputMessage.getBody(), charset)); } protected List<Charset> getAcceptedCharsets() { return this.availableCharsets; } private Charset getContentTypeCharset(MediaType contentType) { if ((contentType != null) && (contentType.getCharSet() != null)) { return contentType.getCharSet(); } return DEFAULT_CHARSET; } }
然后,修改spring的注入配置,将自己编写的类注入到org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter中,配置代码如下
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean id="utf8StringHttpMessageConverter" class="**.UTF8StringHttpMessageConverter" /> </list> </property> </bean>
Spring mvc responsebody 中文乱码问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。