Java Class 在 OSGI 中使用 cxf 生成的客户端时加载程序问题和 JaxB 异常

Java Class loader issue and JaxB Exception in consuming the cxf generated client in OSGI

我是 CXF 和 JAXB 的新手。作为我的 Java 项目的一部分,我正在做一个概念验证。尝试从 wsdl 生成客户端以通过将其替换为 Apache CXF 来删除我的应用程序中的 weblogic 依赖项。我的应用程序基于 OSGI 模型,并使用 Adob​​e CQ 5.4 作为 Web 工具进行 UI 开发。我的应用程序部署在 Oracle weblogic server 10.3.4 和 运行 java 1.6.

使用 Ant 1.8 作为我的构建脚本来生成 Web 服务客户端并将这些 classes 打包为一个单独的 jar 并将其添加到我的包 classpath.

在我的 ant 构建脚本中使用了以下命令

<java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">

生成我的客户端。我正在使用 2.7.2 版本的 CXF。

当我调用 CXF 生成的服务时 class 如下所示,

QueryCustomerOutService queryCustomerIdentification = new QueryCustomerOutService();

使用 OSGI class 加载程序和 java 代码如下:

ClassLoader osgiClassLoader = getClass().getClassLoader();

ClassLoader weblogicClassLoader = Thread.currentThread().getContextClassLoader();

  try{
Thread.currentThread().setContextClassLoader(osgiClassLoader);
//invoking my service
}
finally{
  Thread.currentThread().setContextClassLoader(weblogicClassLoader);
}

我低于异常:

org.apache.cxf.service.factory.ServiceConstructionException 在 org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:332) 在 org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86) 在 org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:475) 在 org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:537) 在 org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:249) 在 org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101) 在 org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90) 在 org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:156)

weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277) 在 weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183) 在 weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454) 在 weblogic.work.ExecuteThread.execute(ExecuteThread.java:207) 在 weblogic.work.ExecuteThread.run(ExecuteThread.java:176) 原因:javax.xml.bind.JAXBException:未找到提供商 com.sun.xml.bind。v2.ContextFactory - 有链接异常: [java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory 未被 [我的包名称][419]] 找到 在 javax.xml.bind.ContextFinder.loadSpi(ContextFinder.java:176) 在 javax.xml.bind.ContextFinder.find(ContextFinder.java:101) 在 javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:65) 在 org.apache.cxf.common.jaxb.JAXBContextCache$2.run(JAXBContextCache.java:267) 在 org.apache.cxf.common.jaxb.JAXBContextCache$2.run(JAXBContextCache.java:265) 在 java.security.AccessController.doPrivileged(本机方法) 在 org.apache.cxf.common.jaxb.JAXBContextCache.createContext(JAXBContextCache.java:265) 在 org.apache.cxf.common.jaxb.JAXBContextCache.getCachedContextAndSchemas(JAXBContextCache.java:172) 在 org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContextAndSchemas(JAXBDataBinding.java:464) 在 org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:330) ... 156 更多 原因:java.lang.ClassNotFoundException:com.sun.xml.bind.v2.ContextFactory [my Bundle name][419] 未找到 在 org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:787) 在 org.apache.felix.framework.ModuleImpl.access400 美元(ModuleImpl.java:71) 在 org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1768) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248) 在 javax.xml.bind.ContextFinder.loadSpi(ContextFinder.java:171) ... 还有 165 个

我在互联网上搜索了很多内容和相关文章,了解到两件事。

  1. CXF 2.7.2 使用 2.2 版本的 jaxws 和 jaxb 作为其绑定。但是我的jdk 1.6使用的是2.1版本的jaxws和jaxb。
  2. 此异常可能是因为 OSGI class 加载问题。

所以根据我从网上获得的信息,我尝试了以下两种方法。

  1. 尝试使用支持 2.1 版 JAXB 的 CXF 2.1 版。但我仍然遇到上述异常。
  2. 尝试使用 CXF 总线工厂 class 加载器调用服务。但是这种方法也会抛出类似的 JAXB 异常,但有更多与 XML 注释未被识别相关的错误。

我的方法是错误的还是我的应用程序中缺少一些基本配置以使其正常工作。如何在部署在 weblogic 服务器中的 OSGI 包中使用 CXF 生成的服务或客户端。

我正在使用 Apache Felix 作为我的 OSGI 容器,因此这方面的信息比给我关于 Apache karaf 的信息更有帮助。我是否需要像为 spring 应用程序那样在我的 OSGI APP-INF 中放置 cxf.xml、cxf-servlet.xml 等配置?[互联网上提供的资源]

我在这个问题上苦苦挣扎了将近一个星期。非常感谢任何及时的帮助。提前致谢。

我解决了这个问题。这不是类加载器或 JAX B 的问题。

我还没有为 CXF 总线绑定导入 cxf.xml 的清单条目,这造成了所有这些问题。现在一切正常。