CXF创建客户端 出现编码 GBK 的不可映射字符问题解决
1问题描述:
在用cxf创建client客户端的时候,在main方法启动,创建客户端是正常的,但是在tomcat中启动的时候,用action去访问,执行以下第三行代码会出现 警告:编码 GBK 的不可映射字符的 问题:
1. String wsdlurl = "http://" + "192.168.0.199:8081" + "/services/hello?wsdl";
2.JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
3. Client client = clientFactory.createClient(wsdlurl);
2.控制台出现问题
D:\work\apache-tomcat-7.0.69\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@506d2be2-1509421150671-src\com\elgin\cxf\service\User.java:56: 错误: 编码GBK的不可映射字符
* 鑾峰彇name灞炴?鐨勫?銆?
^
D:\work\apache-tomcat-7.0.69\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@506d2be2-1509421150671-src\com\elgin\cxf\service\User.java:68: 错误: 编码GBK的不可映射字符
* 璁剧疆name灞炴?鐨勫?銆?
^
D:\work\apache-tomcat-7.0.69\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@506d2be2-1509421150671-src\com\elgin\cxf\service\User.java:68: 错误: 编码GBK的不可映射字符
* 璁剧疆name灞炴?鐨勫?銆?
^
D:\work\apache-tomcat-7.0.69\temp\org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory@506d2be2-1509421150671-src\com\elgin\cxf\service\User.java:68: 错误: 编码GBK的不可映射字符
* 璁剧疆name灞炴?鐨勫?銆?
3.解决方案
在百度搜索解决方案,找来找去都没有解决方案,有个更改eclipse编码的问题的方法还是不能成功,还是自己动手跟踪源码发现,JaxWsDynamicClientFactory在编译的时候,是加载的jdk的默认的编码方式,是这里出现的问题,只要在源码中指定编码utf-8即可解决此问题。源码解决代码:
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.setEncoding("UTF-8");//增加的代码
// System.out.println("your bianma is run 1.7---");
if (System.getProperty("java.version").startsWith("9")) {
javaCompiler.setTarget("9");
} else {
javaCompiler.setTarget("1.7");
}
return javaCompiler.compileFiles(srcList);
}
这个方法在cxf-rt-frontend-simple-3.1.13.jar这个jar包中 org.apache.cxf.endpoint.dynamic.DynamicClientFactory.class中,需要用反编译工具jd-gui进行反编译或者直接下载jar的源码(cxf-rt-frontend-simple-3.1.13.jar的源码资源链接http://download.csdn.net/my),修改过后,再把这个修改的java编译成class文件,然后在cxf-rt-frontend-simple-3.1.13.jar这个jar包中,把org.apache.cxf.endpoint.dynamic.DynamicClientFactory.class覆盖就行。(为方便直接把修改过后的jar包直接分享:http://download.csdn.net/download/liupantao/10106989)
4.说明
由于这个问题网上资源比较少,特共享出解决方案,请尊重个人成果
转载请标明来源:http://blog.csdn.net/liupantao/article/details/78465313