在前面轉換的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項目接口,能夠看到返回的報文內容中文再也不出現亂碼: