前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring返回text/plain出现中文乱码

Spring返回text/plain出现中文乱码

作者头像
全栈程序员站长
发布2022-09-13 10:18:58
1K0
发布2022-09-13 10:18:58
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

今天在RestTemplate调试的时候发现返回的中文出现了乱码,使用postman插件测试却发现没有乱码。

仔细观察返回协议后,发现postman在未设置的时候Accept属性是 */*,所以不是乱码

RestTemplate默认是使用org.springframework.http.converter.StringHttpMessageConverter来解析

代码语言:javascript
复制
/** Create a new instance of the {@link RestTemplate} using default settings. */
	public RestTemplate() {
		this.messageConverters.add(new ByteArrayHttpMessageConverter());
		this.messageConverters.add(new StringHttpMessageConverter());
		this.messageConverters.add(new ResourceHttpMessageConverter());
		this.messageConverters.add(new SourceHttpMessageConverter());
		this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
		if (romePresent) {
			this.messageConverters.add(new AtomFeedHttpMessageConverter());
			this.messageConverters.add(new RssChannelHttpMessageConverter());
		}
		if (jaxb2Present) {
			this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
		}
		if (jackson2Present) {
			this.messageConverters.add(new MappingJackson2HttpMessageConverter());
		}
		else if (jacksonPresent) {
			this.messageConverters.add(new MappingJacksonHttpMessageConverter());
		}
	}

看源码发现

代码语言:javascript
复制
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

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

居然是用的ISO-8859-1来编码的

为了判断是客户端出错还是服务端出错,于是用postman将Accept设置为text/plain测试,发现还是乱码

代码语言:javascript
复制
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
			<property name="supportedMediaTypes">
				<list>
					<value>text/plain;charset=UTF-8</value>
				</list>
			</property>
		</bean>

在spring mvc中配置的类也是这个,必然是这个有问题了

浏览了很多帖子都说改源码

由于我是Maven构建的项目,所以没有修改源码后替换jar包里的class文件,于是新建一个一样的包名,一样的类名

代码语言:javascript
复制
public class StringHttpMessageConverter extends
		AbstractHttpMessageConverter<String> {

	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

将源码复制一下,再将IOS-8859-1改为UTF-8,问题迎刃而解!

但是也有不改源码的方法,将spring mvc 配置文件修改如下

代码语言:javascript
复制
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
	<constructor-arg value="UTF-8" index="0">
	</constructor-arg>
	<property name="supportedMediaTypes">
		<list>
			<value>text/plain;charset=UTF-8</value>
		</list>
	</property>
</bean>

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159860.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档