问题 WebService开发调用正常,部署后调用出错

问题描述

SpringBoot中引用Apache的cxf的jar包,执行WebService调用请求,本地开发测试无问题,项目打包放入服务器执行报错

错误信息

  1. java.lang.IllegalStateException:Unable to create schema compiler

WebService调用出错解决 - 图2

WebService调用出错解决 - 图3

解决方法

会发现缺少了一个类,这个类是在com.sun.tools下面的类,那么看到sun我们首先要意识到这是jdk里面的东西。那么这个时候去找jdk/lib发现有个tools.jar,把它解压往目录里面找,就会找到我们缺少的那个类;我们知道java项目在运行的时候是在jre中运行的,就是说打包的jar项目在jre运行的时候也需要tools.jar里面的类的,但是我们去jre/lib去找,却发现jre/lib没有tools.jar,问题原因找到了,就是:jre运行环境缺少tools.jar,于是我们将jdk里面的tools.jar复制带jre/lib之后再去启动,发现webservice能够正常调用。

问题 编码GBK的不可映射字符

问题描述

使用CXF调用WebService服务出现错误: 编码GBK的不可映射字符

错误信息

image.png
报错原因:
DynamicClientFactory动态编译时对中文不兼容,导致乱码的发生,需要修改源码才能解决。
解决方法:
在项目中新增一类继承DynamicClientFactory,然后覆写compileJavaSrc。

  1. package com.viewhigh.oes.config;
  2. import org.apache.cxf.Bus;
  3. import org.apache.cxf.bus.CXFBusFactory;
  4. import org.apache.cxf.endpoint.EndpointImplFactory;
  5. import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
  6. import org.apache.cxf.jaxws.support.JaxWsEndpointImplFactory;
  7. import java.io.File;
  8. import java.util.List;
  9. /**
  10. * 复写DynamicClientFactory,解决cxf调用webservice出现错误的GBK的不可映射的字符
  11. * @author ZhangXin
  12. * @date 2020-11-23 10:19
  13. */
  14. public class JaxWsDynamicClientFactory extends DynamicClientFactory {
  15. protected JaxWsDynamicClientFactory(Bus bus) {
  16. super(bus);
  17. }
  18. @Override
  19. protected EndpointImplFactory getEndpointImplFactory() {
  20. return JaxWsEndpointImplFactory.getSingleton();
  21. }
  22. @Override
  23. protected boolean allowWrapperOps() {
  24. return true;
  25. }
  26. /**
  27. * Create a new instance using a specific <tt>Bus</tt>.
  28. *
  29. * @param b the <tt>Bus</tt> to use in subsequent operations with the
  30. * instance
  31. * @return the new instance
  32. */
  33. public static JaxWsDynamicClientFactory newInstance(Bus b) {
  34. return new JaxWsDynamicClientFactory(b);
  35. }
  36. /**
  37. * Create a new instance using a default <tt>Bus</tt>.
  38. *
  39. * @return the new instance
  40. * @see CXFBusFactory#getDefaultBus()
  41. */
  42. public static JaxWsDynamicClientFactory newInstance() {
  43. Bus bus = CXFBusFactory.getThreadDefaultBus();
  44. return new JaxWsDynamicClientFactory(bus);
  45. }
  46. /**
  47. * 覆写父类的该方法<br/>
  48. * 注:解决此(错误:编码GBK的不可映射字符)问题
  49. */
  50. @Override
  51. protected boolean compileJavaSrc(String classPath, List<File> srcList, String dest) {
  52. org.apache.cxf.common.util.Compiler javaCompiler
  53. = new org.apache.cxf.common.util.Compiler();
  54. // 设置编译编码格式(此处为新增代码)
  55. javaCompiler.setEncoding("UTF-8");
  56. javaCompiler.setClassPath(classPath);
  57. javaCompiler.setOutputDir(dest);
  58. javaCompiler.setTarget("1.6");
  59. return javaCompiler.compileFiles(srcList);
  60. }
  61. }

在方法调用中,调用复写的JaxWsDynamicClientFactory类