Mule ESB Http項目轉換爲Tomcat項目(6) 中文亂碼問題處理

在前面轉換的Tomcat項目中,咱們發起的json請求內容是英文的,tomcat項目正常處理請求,返回xml報文。可是若是咱們的請求json報文中包含了中文,例如json

{
   "name":"王三",
   "id":"197"
}

這樣的請求發送給ESB項目時中文處理正常,沒有出現亂碼。tomcat

<?xml version='1.0' encoding='UTF-8' ?>
<Student>
<name>王三</name>
<id>197</id>
 </Student>

這是由於ESB項目中的Http Listener控件已經內置了將請求的json報文按UTF-8編碼格式讀取,使得處理請求時不會出現中文亂碼。app

ESB項目轉換成的Tomcat項目使用Servlet inbound endpoint替換了Http Listener控件,處理json報文時缺少了內置編碼支持,響應的xml報文於是出現了亂碼。ui

<?xml version='1.0' encoding='utf-8'?>
<Student>
  <name>王三</name>
  <id>197</id>
</Student>

爲了處理中文亂碼,咱們須要在轉換後的Tomcat項目的流程文件testproject.xml的servlet inbound endpoint後添加如下代碼:編碼

<set-property propertyName="MULE_ENCODING" value="UTF-8" doc:name="Property" />
 <byte-array-to-string-transformer doc:name="Byte Array to String"/>

這兩句代碼第一句是設置ESB流程使用的Encoding爲UTF-8,第二句代碼表示當流程將請求Body Stream讀取爲String字符串(使用第一句設置的UTF-8編碼)。code

修改流程文件後再重啓tomcat,調用tomcat項目,能夠保證送到Tomcat項目中的請求報文不會出現亂碼,可是在響應報文輸出時在有的客戶端仍然會有亂碼。orm

若是咱們使用Soap UI調用Tomcat項目接口,獲得的響應是這樣的:xml

可是當咱們使用httpclient 4.x調用這個接口時,返回的Response中沒有中文亂碼對象

<?xml version='1.0' encoding='UTF-8'?>
<Student>
  <name>張三</name>
  <id>197</id>
</Student>

一樣的請求,在不一樣客戶端的返回出現不一致,這是由於Java程序處理響應報文時,僅僅是按照報文體文本自己內容輸出,而Soap UI,Advanced Rest Client在處理響應報文時,則要根據報文頭部信息顯示響應報文體,在咱們這個項目中,響應的報文體格式是application/xml,可是由於響應報文頭部沒有設定Content Type, soap ui仍根據請求時的Content Type application/json去處理響應報文體,所以沒法正確獲取響應報文的正確編碼格式UTF-8,仍然按照ISO-8859-1格式進行轉碼處理,從而中文顯示爲亂碼。接口

要解決不一樣客戶端調用結果顯示的不一致,咱們須要在Tomcat的流程文件中,設置響應報文的Content-Type:

<response>
    <message-properties-transformer>
        <add-message-property key="Content-Type" value="application/xml;charset=utf-8" />
    </message-properties-transformer>
</response>

若是在流程的返回節點前用戶自定義了用於處理Response的自定義Transformer,也能夠在Transformer類的transformMessage方法中添加以下代碼:

message.setOutboundProperty("Content-Type", "application/xml;charset=utf-8");

這裏的message是響應對應的MuleMessage對象。

用這兩種方法之一對流程文件作了修改後,再調用Tomcat項目接口,能夠看到返回的報文內容中文再也不出現亂碼:

相關文章
相關標籤/搜索