CXF JaxWsDynamicClientFactory 錯誤:編碼GBK的不可對映字元
阿新 • • 發佈:2018-11-20
- JaxWsDynamicClientFactorydcf=JaxWsDynamicClientFactory.newInstance();StringwsUrl="http://www.xxx.com/order.service?wsdl";Clientclient=dcf.createClient(wsUrl);在Windows系統的使用CXF動態客戶端時可能會遇到tomcat啟動後呼叫wsdl遇到很多錯誤GBK編碼,這個錯誤的原因是由於專案maven配
- JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
String wsUrl = "http://www.xxx.com/order.service?wsdl";
Client client = dcf.createClient(wsUrl);
在 Windows 系統的使用 CXF 動態客戶端時可能會遇到 tomcat 啟動後呼叫 wsdl 遇到 很多錯誤GBK編碼,這個錯誤的原因是 由於專案 maven 配置使用 UTF-8 的,CXF 生成java 檔案是使用的UTF-8 的編碼,而使用javac 編譯的時候 取的是系統預設的編碼 由於中文 window 系統採用GBK 編碼,所有就相當於使用javac -encoding gbk *.java,所有就出 出現 如上錯誤,正確的 方法是javac -encoding UTF-8 *.java就可以解決。
查詢org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory,有誤編碼相關設定,可選沒提供,繼續尋找它的父類org.apache.cxf.endpoint.dynamic.DynamicClientFactory,很可惜也沒有。繼續研讀原始碼看他們的編譯過程,在DynamicClientFactory 的 發現compileJavaSrc 方法 如下:
protected boolean compileJavaSrc(String classPath, List srcList, String dest) {
org.apache.cxf.common.util.Compiler javaCompiler
= new org.apache.cxf.common.util.Compiler();javaCompiler.setClassPath(classPath);
javaCompiler.setOutputDir(dest);
javaCompiler.setTarget("1.6");return javaCompiler.compileFiles(srcList);
}
繼續 org.apache.cxf.common.util.Comilper :
重要找到解決辦法了重新實現類DynamicClientFactory 的compileJavaSrc 方法
protected boolean compileJavaSrc(String classPath, List srcList, String dest) {
org.apache.cxf.common.util.Compiler javaCompiler
= new org.apache.cxf.common.util.Compiler();
javaCompiler.setEncoding("UTF-8");
javaCompiler.setClassPath(classPath);
javaCompiler.setOutputDir(dest);
javaCompiler.setTarget("1.6");
return javaCompiler.compileFiles(srcList);
}
這樣就大功告成。
當然還有一種解決思路,既然是 file.encoding 的 問題,我們可以在tomcat 中設定
-Dfile.encoding=UTF-8,這樣編譯器的控制檯同樣需要設定為-Dfile.encoding=UTF-8,也可以解決。