有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在OSGI中使用cxf生成的客户端时出现Java类装入器问题和JaxB异常

我是CXF和JAXB的新手。作为Java项目的一部分,我正在进行概念验证。试图从wsdl生成客户机,用Apache CXF替换应用程序中的weblogic依赖关系。我的应用程序基于OSGI模型,使用Adobe CQ 5.4作为UI开发的web工具。我的应用程序部署在Oracle weblogic server 10.3.4中,并使用java 1.6运行

使用Ant 1.8作为我的构建脚本来生成web服务客户端,并将这些类打包为一个单独的jar,并将其添加到我的包类路径中

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

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

生成我的客户。我使用的是2.7.2版的CXF

当我像下面这样调用CXF生成的服务类时

QueryCustomerOutService queryCustomerIdentification=新建QueryCustomerOutService()

使用OSGI类加载器,java代码如下:

ClassLoader osgiClassLoader = getClass().getClassLoader();

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

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

我得到以下例外:

组织。阿帕奇。cxf。服务工厂ServiceConstructionException 在org。阿帕奇。cxf。jaxb。JAXBDataBinding。初始化(JAXBDataBinding.java:332) 在org。阿帕奇。cxf。服务工厂AbstractServiceFactoryBean。initializeDataBindings(AbstractServiceFactoryBean.java:86) 在org。阿帕奇。cxf。服务工厂ReflectionServiceFactoryBean。buildServiceFromClass(ReflectionServiceFactoryBean.java:475) 在org。阿帕奇。cxf。服务工厂ReflectionServiceFactoryBean。initializeServiceModel(ReflectionServiceFactoryBean.java:537) 在org。阿帕奇。cxf。服务工厂ReflectionServiceFactoryBean。创建(ReflectionServiceFactoryBean.java:249) 在org。阿帕奇。cxf。前端。抽象WSDLBasedEndPointFactory。createEndpoint(AbstractWSDLBasedEndpointFactory.java:101) 在org。阿帕奇。cxf。前端。ClientFactoryBean。create(ClientFactoryBean.java:90) 在org。阿帕奇。cxf。前端。ClientProxyFactoryBean。create(ClientProxyFactoryBean.java:156)

weblogic。servlet。内部的WebAppServletContext。securedExecute(WebAppServletContext.java:2277) 在weblogic。servlet。内部的WebAppServletContext。执行(WebAppServletContext.java:2183) 在weblogic。servlet。内部的ServletRequestImpl。运行(ServletRequestImpl.java:1454) 在weblogic。工作ExecuteThread。execute(ExecuteThread.java:207) 在weblogic。工作ExecuteThread。运行(ExecuteThread.java:176) 原因:javax。xml。绑定JAXBException:提供者com。太阳xml。绑定v2。未找到ContextFactory -除此之外: [java.lang.ClassNotFoundException:com.sun.xml.bind.v2.ContextFactory未被[my bundle name][419]找到。] 在javax。xml。绑定ContextFinder。loadSpi(ContextFinder.java:176) 在javax。xml。绑定ContextFinder。查找(ContextFinder.java:101) 在javax。xml。绑定JAXBContext。newInstance(JAXBContext.java:65) 在org。阿帕奇。cxf。常见的jaxb。JAXBContextCache 2美元。运行(JAXBContextCache.java:267) 在org。阿帕奇。cxf。常见的jaxb。JAXBContextCache 2美元。运行(JAXBContextCache.java:265) 在爪哇。安全访问控制器。doPrivileged(本机方法) 在org。阿帕奇。cxf。常见的jaxb。JAXBContextCache。createContext(JAXBContextCache.java:265) 在org。阿帕奇。cxf。常见的jaxb。JAXBContextCache。getCachedContextAndSchemas(JAXBContextCache.java:172) 在org。阿帕奇。cxf。jaxb。JAXBDataBinding。createJAXBContextAndSchemas(JAXBDataBinding.java:464) 在org。阿帕奇。cxf。jaxb。JAXBDataBinding。初始化(JAXBDataBinding.java:330) ... 还有156个 原因:java。lang.ClassNotFoundException:com。太阳xml。绑定v2。[my Bundle name][419]未找到ContextFactory 在org。阿帕奇。菲利克斯。框架ModuleImpl。findClassOrResourceByDelegation(ModuleImpl.java:787) 在org。阿帕奇。菲利克斯。框架ModuleImpl。访问费$400(ModuleImpl.java:71) 在org。阿帕奇。菲利克斯。框架ModuleImpl$ModuleClassLoader。loadClass(ModuleImpl.java:1768) 在爪哇。lang.ClassLoader。loadClass(ClassLoader.java:248) 在javax。xml。绑定ContextFinder。loadSpi(ContextFinder.java:171) ... 还有165个

我在网上搜索了很多内容和相关文章,然后来到了to了解两件事

  1. CXF2.7.2使用jaxws和jaxb的2.2版本作为其绑定。但我的JDK1.6使用的是jaxws和jaxb的2.1版本
  2. 此异常可能是因为OSGI类加载问题

因此,根据我从互联网上获得的信息,我尝试了以下两种方法

  1. 尝试使用支持JAXB 2.1版的CXF 2.1版。但我还是得到了如上所述的例外
  2. 尝试使用CXF总线工厂类加载器调用服务。但这种方法也给我带来了类似的JAXB异常,但与XML注释相关的错误更多,无法识别

无论我的方法是错误的,还是在我的应用程序中缺少一些基本的配置来使其工作。如何使用部署在weblogic server中的我的OSGI捆绑包中的CXF生成的服务或客户端

我正在使用ApacheFelix作为我的OSGI容器,因此有关这方面的信息比提供ApacheKaraf的信息更有帮助。我是否需要进行配置,比如放置cxf。xml,cxfservlet。我的应用程序-INF中的OSGI的xml和我们在spring应用程序中的一样?[来源于互联网]

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


共 (1) 个答案

  1. # 1 楼答案

    我解决了这个问题。这不是classloader或JAX B的问题

    我还没有输入清单来导入cxf。xml用于CXF总线绑定,这导致了所有这些问题。现在它运行良好