博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring mvc responsebody 中文乱码问题
阅读量:5877 次
发布时间:2019-06-19

本文共 3222 字,大约阅读时间需要 10 分钟。

hot3.png

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
 { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private final List
 availableCharsets; private boolean writeAcceptCharset = true; public UTF8StringHttpMessageConverter() { super(new MediaType[] { new MediaType("text", "plain", UTF8StringHttpMessageConverter.DEFAULT_CHARSET), MediaType.ALL }); this.availableCharsets = new ArrayList
(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
 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中,配置代码如下

    
        
            
        
    

转载于:https://my.oschina.net/u/932347/blog/307337

你可能感兴趣的文章
《程序员代码面试指南》第五章 字符串问题 字符串的统计字符串
查看>>
spring boot 使用swagger
查看>>
中文词频统计
查看>>
那些不错的 [ Html5 + CSS3 + Canvas ] 效果!
查看>>
PHP查看SSL证书信息
查看>>
ES6_入门(2)_const命令
查看>>
day08-文件操作
查看>>
教学-45 对象的相等
查看>>
贪食蛇
查看>>
关于Spring 中的事务
查看>>
为什么现在都用面向对象开发,为什么现在都用分层开发结构?
查看>>
c#实现每隔一段时间执行代码(多线程)
查看>>
[转载]最好的HTML 5编码教程和参考手册分享 .
查看>>
12.6日个人工作总结
查看>>
【离散数学】 SDUT OJ 偏序关系
查看>>
写给学弟学妹的产品入门建议(持续更新)
查看>>
view视图总结
查看>>
C# 知识点随手学习网站推荐
查看>>
equals & ==
查看>>
Java 学习笔记之 方法内的临时变量是线程安全
查看>>