大家好,又见面了,我是你们的朋友全栈君。
今天在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