使用 Mule ESB(基於 Spring-CXF)發布 Web Service 時,@WSDLDocumentation 註解撰寫的中文描述在產生的 WSDL 中顯示為亂碼。純 Spring-CXF 環境下正常,問題出在 Mule 整合層。
?wsdl 請求時,啟動執行緒呼叫鏈,最終由 CxfInboundMessageProcessor 處理輸出。ByteArrayOutputStream,位元組編碼為 UTF-8(CXF 預設),此時資料正確。CxfInboundMessageProcessor 第 201 行呼叫 out.toString() 將位元組流轉為字串。ByteArrayOutputStream.toString() 預設使用 Charset.defaultCharset(),伺服器環境為 GBK,導致 UTF-8 位元組被錯誤解碼為亂碼。public synchronized String toString() {
return new String(buf, 0, count); // 無指定編碼,使用平台預設
}
String 建構子內部透過 StringCoding 取得 Charset.defaultCharset(),JDK 文檔明確說明:預設編碼由 JVM 啟動參數 file.encoding 或作業系統地區設定決定。
啟動參數加入 -Dfile.encoding=UTF-8。雖解決 WSDL 亂碼,但導致伺服器主控台日誌(依賴 OS 編碼)變亂碼。且 WSDL 編碼正確性依賴部署環境,不可控。
修改 CxfInboundMessageProcessor,從 Mule 配置讀取編碼並明確指定:
String enc = event.getMuleContext().getConfiguration().getDefaultEncoding();
msg = out.toString(enc); // 明確指定編碼轉換
Mule 配置檔中設定 defaultEncoding="UTF-8",即可統一控制輸出編碼,不影響其他元件。
WSDL 中文描述正常顯示,@WSDLDocumentation 可安心撰寫中文註解,提升服務文件可讀性。