關於使用cxf調用webservice出現的問題


在近期做了個小的項目,需要調用其他系統的webservice。剛開始隨便網上搜了個cxf調用,出現了很多問題。

在項目通過開發工具開發完成后,通過eclipes啟動項目自測。成功接到數據處理,沒有問題。

然后想springboot項目打成jar,在dos窗口運行。

調用代碼:

// 創建動態客戶端
        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("*", *,*);

問題出現了。報錯:編碼GBK的不可映射字符

然后百度問題,找到解決辦法

1.開發環境和Tomcat都統一設置編碼方式為UTF-8。

弄了半天,還是解決不了。然后就使用第二種。

2.DynamicClientFactory動態編譯時對中文不兼容,導致亂碼的發生,需要修改源碼才能解決。有兩種解決方法:一是將DynamicClientFactory.class進行反編譯,修改代碼后編譯,然后覆蓋jar包中的該文件;二是在項目中新增一類繼承DynamicClientFactory,然后覆寫compileJavaSrc。

這里推薦第二種方法解決
 源碼DynamicClientFactory類中有個下面的方法:

 

只需要在其中加入

// 設置編譯編碼格式(此處為新增代碼)
        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);
    }

}

然后運行項目完美解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM