使用cxf調(diào)用WebService接口時(shí)出錯(cuò),錯(cuò)誤:編碼GBK的不可映射字符

?最近在公司開發(fā)短信發(fā)送接口,第三方接口為WebService接口,采用apache cxf工具包進(jìn)行開發(fā),現(xiàn)在遇到的問題及解決方法記錄下來,以備查用。

此工具包需引用如下jar包:

dependencies {
    compile (
            // cxf support
            'org.apache.cxf:cxf-core:3.1.18',
            'org.apache.cxf:cxf-rt-frontend-jaxws:3.1.18',
            'org.apache.cxf:cxf-rt-transports-http-jetty:3.1.18'
    )

?注:此項(xiàng)目為gradle web項(xiàng)目,其他引用方式請自行百度或Google。

調(diào)用代碼如下:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(PropertiesUtil.getValue("sms.requrl"));
Object[] objects = client.invoke("SendNote", phoneNo, content,
            PropertiesUtil.getValue("sms.username"), PropertiesUtil.getValue("sms.userpwd"),
            PropertiesUtil.getValue("sms.comid"), "", PropertiesUtil.getValue("sms.smsnumber"));
// 獲取響應(yīng)碼
String respCode = objects[0].toString();
log.info("發(fā)送短信響應(yīng)結(jié)果:" + SmsConstants.RESPONSE_CODE.get(respCode));

測試時(shí)出現(xiàn)如下錯(cuò)誤:

D:\JavaProgram\Tomcat\apache-tomcat-8.5.12\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@3c01e324-1552027517229-src\org\tempuri\AddNewUser.java:12: 錯(cuò)誤: 編碼GBK的不可映射字符
 * <p>anonymous complex type鐨? Java 綾匯??
                             ^
D:\JavaProgram\Tomcat\apache-tomcat-8.5.12\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@3c01e324-1552027517229-src\org\tempuri\AddNewUser.java:12: 錯(cuò)誤: 編碼GBK的不可映射字符
 * <p>anonymous complex type鐨? Java 綾匯??
                                      ^
D:\JavaProgram\Tomcat\apache-tomcat-8.5.12\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@3c01e324-1552027517229-src\org\tempuri\AddNewUser.java:12: 錯(cuò)誤: 編碼GBK的不可映射字符
 * <p>anonymous complex type鐨? Java 綾匯??
                                       ^
...... 此處省略

?注:開發(fā)環(huán)境和Tomcat都統(tǒng)一設(shè)置編碼方式為UTF-8。

?網(wǎng)上搜索了好久,找到了思路,DynamicClientFactory動(dòng)態(tài)編譯時(shí)對中文不兼容,導(dǎo)致亂碼的發(fā)生,需要修改源碼才能解決。有兩種解決方法:一是將DynamicClientFactory.class進(jìn)行反編譯,修改代碼后編譯,然后覆蓋jar包中的該文件;二是在項(xiàng)目中新增一類繼承DynamicClientFactory,然后覆寫compileJavaSrc。

?對于gradle和maven管理的項(xiàng)目來說,第一種方式是不可行的,只有第二次方法是最好的解決方法,修改后的代碼如下:

/**
 * 覆寫父類的compileJavaSrc方法,解決動(dòng)態(tài)編譯亂碼問題
 *
 * @author yueli.liao
 * @date 2019-03-08 14:10
 */
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/>
     * 注:解決此(錯(cuò)誤:編碼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();

        // 設(shè)置編譯編碼格式(此處為新增代碼)
        javaCompiler.setEncoding("UTF-8");

        javaCompiler.setClassPath(classPath);
        javaCompiler.setOutputDir(dest);
        javaCompiler.setTarget("1.6");

        return javaCompiler.compileFiles(srcList);
    }

}

采用此方法完美解決亂碼問題,并測試通過。撒花......

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容