zoukankan      html  css  js  c++  java
  • XML:使用cxf调用WebService接口时报错:编码GBK的不可映射字符(设置UTF-8字符集)

    调用代码如下

    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"));
    // 获取响应码
    String respCode = objects[0].toString();
    log.info("发送短信响应结果:" + SmsConstants.RESPONSE_CODE.get(respCode));

    测试时出现如下错误(中文乱码)

    D:JavaProgramTomcatapache-tomcat-8.5.12	emporg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@3c01e324-1552027517229-srcorg	empuriAddNewUser.java:12: 错误: 编码GBK的不可映射字符
     * <p>anonymous complex type鐨? Java 绫汇??
                                 ^
    D:JavaProgramTomcatapache-tomcat-8.5.12	emporg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@3c01e324-1552027517229-srcorg	empuriAddNewUser.java:12: 错误: 编码GBK的不可映射字符
     * <p>anonymous complex type鐨? Java 绫汇??
                                          ^
    D:JavaProgramTomcatapache-tomcat-8.5.12	emporg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@3c01e324-1552027517229-srcorg	empuriAddNewUser.java:12: 错误: 编码GBK的不可映射字符
     * <p>anonymous complex type鐨? Java 绫汇??
                                           ^
    ...... 此处省略

    注:开发环境和Tomcat都统一设置编码方式为UTF-8。

    报错原因:

    DynamicClientFactory动态编译时对中文不兼容,导致乱码的发生,需要修改源码才能解决。

    解决方法:

    在项目中新增一类继承DynamicClientFactory,然后覆写compileJavaSrc。
    /**
     * 覆写父类的compileJavaSrc方法,解决动态编译乱码问题
     *
     * @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/>
         * 注:解决此(错误:编码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);
        }
    
    }

    引用如上实现类JaxWsDynamicClientFactory进行操作。

    文章转载至:https://www.jianshu.com/p/3e8dfe71475a

  • 相关阅读:
    【网络公开课总结】砸蛋中奖效果
    【网络收集】如何修改vs tfs的登录名和密码 .
    在rdlc 中 显示成 yyyy年MM月dd日
    sql 将某一列的值拼接成字符串
    【网络收集】获取JavaScript 的时间使用内置的Date函数完成
    处理传递过来的拼接的值,中间用逗号相隔
    行列转换 pivot
    【网络收集】存储过程中自动生成主键
    Java多线程基础知识整理二
    Java多线程基础知识整理
  • 原文地址:https://www.cnblogs.com/nhdlb/p/12968749.html
Copyright © 2011-2022 走看看