Spring org.springframework.web.client.RestTemplate乱码

@spring version 4.2.3

  • RestTemplate 实例化时需要HTTPMessageConverters
RestTemplate(List<HttpMessageConverter<?>> messageConverters)
Create a new instance of the RestTemplate using the given list of HttpMessageConverter to use
  • 因我需要HTTPMessageConverters的实现类:StringHttpMessageConverter,所以接下来是用这个来举例,先给几个HTTPMessageConverters的实现类,官网上也有说明:
All Known Implementing Classes:
AbstractGenericHttpMessageConverter, AbstractHttpMessageConverter, AbstractJackson2HttpMessageConverter, AbstractJaxb2HttpMessageConverter, AbstractWireFeedHttpMessageConverter, AbstractXmlHttpMessageConverter, AllEncompassingFormHttpMessageConverter, AtomFeedHttpMessageConverter, BufferedImageHttpMessageConverter, ByteArrayHttpMessageConverter, FormHttpMessageConverter, GsonHttpMessageConverter, Jaxb2CollectionHttpMessageConverter, Jaxb2RootElementHttpMessageConverter, MappingJackson2HttpMessageConverter, MappingJackson2XmlHttpMessageConverter, MarshallingHttpMessageConverter, ObjectToStringHttpMessageConverter, ProtobufHttpMessageConverter, ResourceHttpMessageConverter, RssChannelHttpMessageConverter, SourceHttpMessageConverter, StringHttpMessageConverter, XmlAwareFormHttpMessageConverter
  • 记下来说StringHttpMessageConverter
    见官网:
Constructor Summary

Constructors
Constructor and Description
StringHttpMessageConverter()
A default constructor that uses "ISO-8859-1" as the default charset.
StringHttpMessageConverter(Charset defaultCharset)
A constructor accepting a default charset to use if the requested content type does not specify one

有两个构造函数,如果使用第一个,spring默认使用第一个,那么我们编码就是ISO,
所以我们需要使用第二个。

  • 先用传统代码来实现:
import java.nio.charset.Charset;
import java.util.List;

import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import com.google.common.collect.Lists;

public class RestTemplateCover extends RestTemplate{
    public RestTemplateCover() {
        List<HttpMessageConverter<?>> messages = Lists.newArrayList();
        StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        messages.add(converter);
        this.setMessageConverters(messages);
    }
}

spring servlet.xml中加入:

<bean id = "restTemplate" class="xxx.xxx.xx.RestTemplateCover"></bean>
  • 但是这种方式太麻烦,还要改了然后再加入。何不必直接使用xml(其实真实原因是因为本人xml不行,下面的xml配置弄了半天才出来的):
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">   
       <list>   
           <bean class = "org.springframework.http.converter.StringHttpMessageConverter">   
              <constructor-arg type="java.nio.charset.Charset">
                    <value>UTF-8</value>
              </constructor-arg> 
           </bean>
       </list>   
    </property>
</bean>

总结

  • 经过这次对这个RestTemplate乱码问题的处理,对问题处理的认知也有了自己的想法。
    1.不要急,先百度下,如果百度不到,翻看源码。
    2.翻看源码,仔细的观察会使什么原因导致的。比如这次是因为charset导致的。我们在看RestTemplate的时候很轻易的可以找到messageConverters是导致乱码的原因(总共就几个构造函数)。
    http://docs.spring.io/spring/docs/current/javadoc-api/
    从HttpMessageConverter的实现类中选取自己需要的: StringHttpMessageConverter。
    它的构造函数有设置编码的方法。从而达到目的。

  • 知识积累:
    某类用构造函数,而我们需要对有参数的进行注入:

<bean class="xxx.java">
    <constructor-arg value="xxx"/>  
</bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值