• CXF JaxWsDynamicClientFactory 错误:编码GBK的不可映射字符


      • JaxWsDynamicClientFactorydcf=JaxWsDynamicClientFactory.newInstance();StringwsUrl="http://www.xxx.com/order.service?wsdl";Clientclient=dcf.createClient(wsUrl);在Windows系统的使用CXF动态客户端时可能会遇到tomcat启动后调用wsdl遇到很多错误GBK编码,这个错误的原因是由于项目maven配
      • JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        String wsUrl = "http://www.xxx.com/order.service?wsdl";
        Client client = dcf.createClient(wsUrl);

        在 Windows 系统的使用 CXF 动态客户端时可能会遇到 tomcat 启动后调用 wsdl 遇到 很多错误GBK编码,这个错误的原因是 由于项目 maven 配置使用 UTF-8 的,CXF 生成java 文件是使用的UTF-8 的编码,而使用javac 编译的时候 取的是系统默认的编码 由于中文 window 系统采用GBK 编码,所有就相当于使用javac -encoding gbk *.java,所有就出 出现 如上错误,正确的 方法是javac -encoding UTF-8 *.java就可以解决。


        查询org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory,有误编码相关设置,可选没提供,继续寻找它的父类org.apache.cxf.endpoint.dynamic.DynamicClientFactory,很可惜也没有。继续研读源码看他们的编译过程,在DynamicClientFactory 的 发现compileJavaSrc 方法 如下:


        protected boolean compileJavaSrc(String classPath, List srcList, String dest) {
        org.apache.cxf.common.util.Compiler javaCompiler
        = new org.apache.cxf.common.util.Compiler();javaCompiler.setClassPath(classPath);
        javaCompiler.setOutputDir(dest);
        javaCompiler.setTarget("1.6");return javaCompiler.compileFiles(srcList);
        }

        继续 org.apache.cxf.common.util.Comilper :


        CXF JaxWsDynamicClientFactory 错误:编码GBK的不可映射字符_Java


        重要找到解决办法了重新实现类DynamicClientFactory 的compileJavaSrc 方法


        protected boolean compileJavaSrc(String classPath, List 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);
        }

        这样就大功告成。


        当然还有一种解决思路,既然是 file.encoding 的 问题,我们可以在tomcat 中设置


        -Dfile.encoding=UTF-8,这样编译器的控制台同样需要设置为-Dfile.encoding=UTF-8,也可以解决。

  • 相关阅读:
    RadioButton 用法
    输出复选框选中的文件名 checkbox
    dropdownlist select的用法
    货币的值如何按各个不同国家的习惯来输出
    sqlserver 面试题
    更新数据的脚本
    《C++ Primer》读书笔记—第九章 顺序容器
    《C++ Primer》读书笔记—第八章 IO库
    《C++ Primer》读书笔记—第七章 类
    《C++ Primer》读书笔记—第六章 函数
  • 原文地址:https://www.cnblogs.com/toughzcf/p/9988072.html
Copyright © 2020-2023  润新知