大家好,又见面了,我是你们的朋友全栈君。
今天在RestTemplate调试的时候发现返回的中文出现了乱码,使用postman插件测试却发现没有乱码。
仔细观察返回协议后,发现postman在未设置的时候Accept属性是 */*,所以不是乱码
RestTemplate默认是使用org.springframework.http.converter.StringHttpMessageConverter来解析
/** 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());
}
}
看源码发现
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
居然是用的ISO-8859-1来编码的
为了判断是客户端出错还是服务端出错,于是用postman将Accept设置为text/plain测试,发现还是乱码
<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文件,于是新建一个一样的包名,一样的类名
public class StringHttpMessageConverter extends
AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
将源码复制一下,再将IOS-8859-1改为UTF-8,问题迎刃而解!
但是也有不改源码的方法,将spring mvc 配置文件修改如下
<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>
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159860.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...