CXF創建客戶端 出現編碼 GBK 的不可映射字符問題解決
1問題描述:
在用cxf創建client客戶端的時候,在main方法啓動,創建客戶端是正常的,但是在tomcat中啓動的時候,用action去訪問,執行以下第三行代碼會出現 警告:編碼 GBK 的不可映射字符的 問題:
1. String wsdlurl = "http://" + "192.168.0.199:8081" + "/services/hello?wsdl";
2.JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
3. Client client = clientFactory.createClient(wsdlurl);
2.控制檯出現問題
D:\work\apache-tomcat-7.0.69\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@506d2be2-1509421150671-src\com\elgin\cxf\service\User.java:56: 錯誤: 編碼GBK的不可映射字符
* 鑾峯彇name灞炴?鐨勫?銆?
^
D:\work\apache-tomcat-7.0.69\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@506d2be2-1509421150671-src\com\elgin\cxf\service\User.java:68: 錯誤: 編碼GBK的不可映射字符
* 璁劇疆name灞炴?鐨勫?銆?
^
D:\work\apache-tomcat-7.0.69\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@506d2be2-1509421150671-src\com\elgin\cxf\service\User.java:68: 錯誤: 編碼GBK的不可映射字符
* 璁劇疆name灞炴?鐨勫?銆?
^
D:\work\apache-tomcat-7.0.69\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@506d2be2-1509421150671-src\com\elgin\cxf\service\User.java:68: 錯誤: 編碼GBK的不可映射字符
* 璁劇疆name灞炴?鐨勫?銆?
3.解決方案
在百度搜索解決方案,找來找去都沒有解決方案,有個更改eclipse編碼的問題的方法還是不能成功,還是自己動手跟蹤源碼發現,JaxWsDynamicClientFactory在編譯的時候,是加載的jdk的默認的編碼方式,是這裏出現的問題,只要在源碼中指定編碼utf-8即可解決此問題。源碼解決代碼:
protected boolean compileJavaSrc(String classPath, List<File> srcList, String dest) {
org.apache.cxf.common.util.Compiler javaCompiler
= new org.apache.cxf.common.util.Compiler();
javaCompiler.setClassPath(classPath);
javaCompiler.setOutputDir(dest);
javaCompiler.setEncoding("UTF-8");//增加的代碼
// System.out.println("your bianma is run 1.7---");
if (System.getProperty("java.version").startsWith("9")) {
javaCompiler.setTarget("9");
} else {
javaCompiler.setTarget("1.7");
}
return javaCompiler.compileFiles(srcList);
}
這個方法在cxf-rt-frontend-simple-3.1.13.jar這個jar包中 org.apache.cxf.endpoint.dynamic.DynamicClientFactory.class中,需要用反編譯工具jd-gui進行反編譯或者直接下載jar的源碼(cxf-rt-frontend-simple-3.1.13.jar的源碼資源鏈接http://download.csdn.net/my),修改過後,再把這個修改的java編譯成class文件,然後在cxf-rt-frontend-simple-3.1.13.jar這個jar包中,把org.apache.cxf.endpoint.dynamic.DynamicClientFactory.class覆蓋就行。(爲方便直接把修改過後的jar包直接分享:http://download.csdn.net/download/liupantao/10106989)
4.說明
由於這個問題網上資源比較少,特共享出解決方案,請尊重個人成果
轉載請標明來源:http://blog.csdn.net/liupantao/article/details/78465313