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

本文介绍了解决在Windows系统下使用CXF动态客户端时遇到的GBK编码问题。详细解释了错误产生的原因,并提供了两种解决方案:一是通过重写`DynamicClientFactory`中的`compileJavaSrc`方法来指定编码;二是通过在Tomcat中设置`-Dfile.encoding=UTF-8`参数。
摘要由CSDN通过智能技术生成
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<File> 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 :

142716_YK5G_1434216.png

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

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);
}

这样就大功告成。

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

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

详情见: IntelliJ IDEA 控制台中文乱码解决方案 

转载于:https://my.oschina.net/u/1434216/blog/859645

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>