成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用mule生成WSDL中文亂碼問題解決方法

開發 后端
在發布Web服務 的時候,WSDL 作為服務的描述,里面有一個標簽可以寫入中文,是用來作為注解來寫入描述性信息的,這個標簽就是。

在發布Web服務 的時候,WSDL 作為服務的描述,里面有一個標簽可以寫入中文,是用來作為注解來寫入描述性信息的,這個標簽就是。OECP平臺中使用開源ESB總線mule 來做webService 發布使用.發布時就遇到了中文 描述亂碼 問題,經過一天多的時間來翻閱mule和cxf的源代碼,問題最終被解決。這里記錄一下解決的過程和方法。

mule 內使用的spring-cxf來將一個java方法轉換為webService 。cxf有一個annotation是生成wsdl 中的 標簽用的,這個annotation就是@WSDLDocumentation 。但是這個標簽使用后,生成的WSDL 文件,中文 卻顯示成了亂碼 。

經過測試發現,單純使用Spring-cxf時,@WSDLDocumentation 不會產生亂碼 。這就說明問題出在mule 上。只能翻一下mule 的源代碼來查找原因了。由于找不到與當前使用的jar包版本相同的源代碼,只能使用升級版的源碼,調試的時候發現升級的改動比較大,刪掉的以前的一些方法和代碼修改也蠻多,錯行缺行導致調試可讀性極差,讓我一直看了一天多。比較安慰的是最終還是找到了問題原因并解決了。下面就具體說一下原理。

我們知道發布WebService 以后,使用url+?wsdl的方式訪問,將會獲取到服務描述文件wsdl 文件.mule 中發布服務后,使用這種方式訪問服務器將會啟動一個線程,線程調用鏈如下圖:

 

標記①下面,是http請求引起的mule 事件級聯鏈條,是mule 內部的架構機制,這個不是我們現在要所關注的.重點在第②行,紅色標記出的OutputStream就是用來承載wsdl 文件流的對象,實際上它是一個ByteArrayOutputStream。在圖上⑥的位置執行完后,這個Stream將被寫入完成。前面的每一個步驟中文字符 的編碼都是正確的,即便是寫入到Stream中,字符的byte編碼也沒有問題。但是,此時我們發現查看這個Stream的內容時,卻看到了亂碼 。這是為什么呢?為什么Stream中存儲的byte沒錯,但是卻能看到亂碼呢?

經常調試程序的朋友們知道,當我們查看一個對象的內容時,對象查看器,將調用對象的toString方法。經檢查發現ByteArrayOutputStream的toString方法果然被重寫:

java 代碼

  1. public synchronized String toString() {  
  2. return new String(buf, 0 , count);  

ByteArrayOutputStream使用buffer中所有的byte創建并返回了一個String對象。這里注意,創建String的時候并沒有指定編碼格式。那么它用的是什么編碼格式?我們去String中看看,String使用了StringCoding來轉化byte為char數組,而其中選用的編碼格式是從Charset.defaultCharset()得來的。從JDK的API中我們能找到了這個方法,上面是這么說的:

 

 

在我們的服務器運行環境中得到的默認編碼 格式為GBK。于是亂碼形成的原因找到了:由于Spring-cxf生成服務的wsdl 時用的是UTF-8編碼,而被mule 錯誤的使用了服務器運行環境默認編碼GBK,所以UTF-8下的正常顯示中文 最終被顯示為亂碼 了。

mule 中的類CxfInboundMessageProcessor第201行:

msg = out.toString();

這就是亂碼 產生的根源,在將字節流轉為字符串的時候,沒有指定編碼格式,而默認使用了GBK,就是wsdl 文件亂碼 的原因。

解決這個問題又兩種方案:

1. 改變jvm的默認字符編碼。

2. 修改CxfInboundMessageProcessor類的源代碼。

第一種方案通過修改服務器的啟動參數,追加一段“-Dfile.encoding=UTF-8”,就可以改變服務器的java運行環境。此時啟動服務器時我們會發現,雖然我們的WSDL中文不再出現亂碼了,但是服務器控制臺顯示的中文 卻全都成了亂碼 。我猜是服務器的日志輸出依賴于操作系統的默認字符集吧。暫且不說這個日志亂碼 問題,即使不存在這個問題我認為這種方案也是不太合適的。wsdl 是否出現亂碼依賴于運行服務器的默認字符集,對于OECP平臺來說是不可控的。OECP平臺使用什么樣的字符編碼應該依賴于應用自己的配置。

于是決定修改mule 的源代碼,比較幸運的是CxfInboundMessageProcessor這個類,在升級的過程中沒有改動,不然就要反編譯來獲取源碼了。

將201行的msg = out.toString();修改為如下代碼:

java 代碼

  1. String enc = event.getMuleContext().getConfiguration().getDefaultEncoding();  
  2. msg = out.toString(enc); 

從mule 的配置中得到配置的編碼格式,并在將Stream轉換為String的時候指定使用此編碼格式.至此問題解決了.

我們可以在使用mule發布服務時,使用WSDLDocumentation 標簽來為服務添加描述了.wsdl 作為WebService 的描述,如果沒有注釋性的文字,wsdl 描述可讀性實在不是很好. WSDLDocumentation 標簽就是作為這種描述存在的,如果你想在WSDL 中加入中文 的描述這個標簽應該是唯一的選擇.如果你使用的也是mule ,也遇到了中文 的亂碼 問題,希望可上面的內容可以幫助你。

作者本人將原文轉發到此,原文地址為:http://www.oecp.cn/hi/slx/blog/2315

文章地址:http://songlixiao.iteye.com/blog/1085140

【編輯推薦】

  1. Oracle計劃修復Java SE中的17個漏洞
  2. Oracle推出Java SE6漏洞補丁名為Update 26
  3. Spring整合DWR comet 實現無刷新 多人聊天室
責任編輯:艾婧 來源: ITEYE
相關推薦

2009-07-17 14:33:05

Jython中文問題

2009-02-18 14:28:23

編碼亂碼JSP

2011-03-18 18:47:34

QtMySQL

2009-06-09 15:51:07

Java ee中文問題解決方法

2009-08-14 13:49:58

Rails中文問題

2013-06-14 10:48:53

IIS 7

2009-12-28 10:56:45

WPF Image

2009-02-26 11:13:41

Weblogic中間件JSP

2010-07-29 15:28:47

Flex安全沙箱

2010-06-09 16:33:46

Cacti中文

2010-08-03 09:12:52

Flex安全沙箱

2010-05-26 11:08:33

SVN管理

2009-06-19 11:16:14

java web中文亂碼

2011-06-13 16:16:32

Qt 中文問題

2009-11-17 10:43:59

ubuntu 9.10輸入法解決方法

2009-10-29 10:04:57

VB.NET Read

2010-05-11 15:09:51

Unix系統

2011-05-18 14:00:30

在線備份

2010-01-13 21:06:37

雙絞線

2009-07-02 13:26:32

JSP中文亂碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本高清不卡视频 | 精品久久久久久久久久久久久久 | a在线观看 | 久久久国产一区二区三区四区小说 | 欧美日韩国产欧美 | 日韩欧美精品一区 | 亚洲九九 | 天天曰天天干 | 看一级毛片 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 91视频一区 | 一区在线视频 | 影视先锋av资源噜噜 | 伊人免费在线观看 | 成人h动漫精品一区二区器材 | 免费一级淫片aaa片毛片a级 | 国产精品伦理一区二区三区 | 欧美日韩一区二区三区在线观看 | 免费亚洲一区二区 | 一区二区三区不卡视频 | 欧美成人一级 | 日韩在线免费视频 | 亚洲免费观看视频网站 | 欧美炮房 | 久久伊人一区二区 | 青春草在线 | 淫片一级国产 | 久久av网 | 国产精品免费观看 | 国产高清亚洲 | 国产一区二区三区在线免费 | 国产精品一区二区三区久久久 | 最近最新中文字幕 | 日韩91 | 91毛片在线看 | 久久中文高清 | 久久一本 | 91中文字幕在线观看 | 成人深夜小视频 | 精品一区二区三区在线观看 | 日本天堂视频 |