1. 程式人生 > >CXF JaxWsDynamicClientFactory 錯誤:編碼GBK的不可對映字元

CXF JaxWsDynamicClientFactory 錯誤:編碼GBK的不可對映字元

    • 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 :


      CXF JaxWsDynamicClientFactory 錯誤:編碼GBK的不可對映字元_Java


      重要找到解決辦法了重新實現類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,也可以解決。