Spring RestTemplate 中文亂碼 簡析【3.2.3Release】

發現很多人碰到Spring RestTemplate 有中文亂碼的問題,網上有兩種解決辦法:

第一種,修改StringHttpMessageConverter類:

StringHttpMessageConverter類,默認是的編碼是ISO-8859-1:
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

把StringHttpMessageConverter這個類的源碼中的

Charset.forName("ISO-8859-1");
   改爲
   Charset.forName("utf-8");

編譯後重新放在org.springframework.web-3.0.5.RELEASE.jar中

這種辦法個人不太喜歡。


第二種:用配置方式,在你的app-context.xml中寫入AnnotationMethodHandlerAdapte配置

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >

<property name="messageConverters">  
         <list>  
             <bean class = "org.springframework.http.converter.StringHttpMessageConverter">  
                <property name = "supportedMediaTypes">
                      <list>
                          <value>text/html;charset=UTF-8</value>  
                     </list>  
                </property>  
             </bean>  
         </list>  
   </property>
</bean>

這個其實也有問題,不能從根本解決亂碼,因爲它只對服務端起作用,而RestTemplate不會用作用,畢竟RestTemplate 是一個client,必須保證client編碼跟服務端接受的編碼一致,否則還是會出現亂碼;

我的解決辦法就是在app-context.xml裏面配置好RestTemplate的messageConverters:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <property name="messageConverters">
            <list>
                <bean
                    class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/x-www-form-urlencoded;charset=UTF-8</value>
                            <value>multipart/form-data;charset=UTF-8</value>
                            <value>text/plain;charset=UTF-8</value>
                            <value>application/xml;charset=UTF-8</value>
                        </list>
                    </property>
                    <property name="partConverters">
                        <list>
                            <bean
                                class="org.springframework.http.converter.StringHttpMessageConverter">
                                <property name="supportedMediaTypes">
                                    <list>
                                        <value>text/html;charset=UTF-8</value>
                                        <value>text/plain;charset=UTF-8</value>
                                        <value>multipart/form-data;charset=UTF-8</value>
                                        <value>application/xml;charset=UTF-8</value>
                                    </list>
                                </property>
                            </bean>
                            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
                            <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
                            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
                            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
                            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
                        </list>
                    </property>
                </bean>
                <bean
                    class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                            <value>text/plain;charset=UTF-8</value>
                            <value>multipart/form-data;charset=UTF-8</value>
                            <value>application/xml;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

其中的關鍵就是partConverters,對他裏面的Converter進行編碼的配置;

另外,在代碼裏面要用autowired的辦法注入RestTemplate ,new RestTemplate的話還是會用原來的partConverters 的配置。

 
@Autowired
    RestTemplate rt;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章