在近期作了個小的項目,須要調用其餘系統的webservice。剛開始隨便網上搜了個cxf調用,出現了不少問題。java
在項目經過開發工具開發完成後,經過eclipes啓動項目自測。成功接到數據處理,沒有問題。web
而後想springboot項目打成jar,在dos窗口運行。spring
調用代碼:apache
// 建立動態客戶端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://10.7.101.43:9081/contract/service/IActTransactionWebService?wsdl");
//調用webservice
// 須要密碼的狀況須要加上用戶名和密碼
// client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
Object[] objects = new Object[0];
try {
// invoke("方法名",參數1,參數2,參數3....);
objects = client.invoke("*", *,*); springboot
問題出現了。報錯:編碼GBK的不可映射字符app
而後百度問題,找到解決辦法ide
1.開發環境和Tomcat都統一設置編碼方式爲UTF-8。工具
弄了半天,仍是解決不了。而後就使用第二種。開發工具
2.DynamicClientFactory動態編譯時對中文不兼容,致使亂碼的發生,須要修改源碼才能解決。有兩種解決方法:一是將DynamicClientFactory.class進行反編譯,修改代碼後編譯,而後覆蓋jar包中的該文件;二是在項目中新增一類繼承DynamicClientFactory,而後覆寫compileJavaSrc。編碼
只須要在其中加入
// 設置編譯編碼格式(此處爲新增代碼)
javaCompiler.setEncoding("UTF-8"); 這段代碼便可解決。
因此本身建立JaxWsDynamicClientFactory繼承DynamicClientFactory類重寫compileJavaSrc方法
本身的JaxWsDynamicClientFactory以下:
public class JaxWsDynamicClientFactory extends DynamicClientFactory {
protected JaxWsDynamicClientFactory(Bus bus) {
super(bus);
}
@Override
protected EndpointImplFactory getEndpointImplFactory() {
return JaxWsEndpointImplFactory.getSingleton();
}
protected boolean allowWrapperOps() {
return true;
}
/**
* Create a new instance using a specific <tt>Bus</tt>.
*
* @param b the <tt>Bus</tt> to use in subsequent operations with the
* instance
* @return the new instance
*/
public static JaxWsDynamicClientFactory newInstance(Bus b) {
return new JaxWsDynamicClientFactory(b);
}
/**
* Create a new instance using a default <tt>Bus</tt>.
*
* @return the new instance
* @see CXFBusFactory#getDefaultBus()
*/
public static JaxWsDynamicClientFactory newInstance() {
Bus bus = CXFBusFactory.getThreadDefaultBus();
return new JaxWsDynamicClientFactory(bus);
}
/**
* 覆寫父類的該方法<br/>
* 注:解決此(錯誤:編碼GBK的不可映射字符)問題
*
* @return
*/
@Override
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.setEncoding("UTF-8");
javaCompiler.setClassPath(classPath);
javaCompiler.setOutputDir(dest);
javaCompiler.setTarget("1.6");
return javaCompiler.compileFiles(srcList);
}
}
而後運行項目完美解決。