当前位置: 首页 > 知识库问答 >
问题:

Java类加载器问题和使用OSGI中cxf生成的客户端的JaxB异常

广瑞
2023-03-14

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

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

在我的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);
}

我得到以下例外:

org.apache.cxf.service.factory.服务构造例外org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:332)在org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86)在org.apache.cxf.service.factory.反射ServiceFactoryBean.buildServiceFromClass(反射服务ean.java:475)在org.apache.cxf.service.factory.反射服务工厂Bean.initialize服务模型(反射服务工厂Bean.java:537)在org.apache.cxf.service.factory.反射服务工厂Bean.create(反射服务工厂Bean.java:249)在org.apache.cxf.frontend.AbstractWSDLBasedEndpoint Factory.createEndpoint(AbstractWSDLBasedEndpoint Factory.java:101),org.apache.cxf.frontend.ClientFactoryBean. create(ClientFactoryBean. java: 90),网址为org. apache. cxf. facenten。创建(ClientProxyFactoryBean. java: 156)

weblogic.servlet.internal.WebAppServletContext.secured执行(WebAppServletContext.java:2277)在weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)在weblogic.servlet.internal.Servlet刚需mpl.run(Servlet刚需mpl.java:1454)在weblogic.work.执行hread.execute(执行hread.java:207)在weblogic.work.执行hread.run(执行hread.java:176)引起原因:javax.xml.bind.JAXB异常:提供商com.sun.xml.bind.v2。未找到ContextFactory-有链接异常:[java.lang.ClassNotFoundExcture:com.sun.xml.bind.v2。在javax. xml. bind的javax.xml.bind.ContextFinder. loadSpi(ContextFinder. java: 176)中,[我的捆绑包名称][419]无法找到ContextFactory。查找(ContextFinder. java: 101)在javax. xml. bind。JAXBContext. newInstance(JAXBContext. java: 65)at org. apache. cxf. conf. jaxb.JAXB ContextCache2 USD. run(JAXB ContextCache. java: 267)at org. apache. cxf. conf. jaxb。JAXBContextCache2 Dollars. run(JAXBContextCache. java: 265)at java. security.AccessController. doPrivileged(本地方法)在org. apache. cxf.通用. jaxb。JAXB ContextCache. createContext(JAXB ContextCache. java: 265)在org. apache. cxf.通用. jaxb。JAXB ContextCache. getCachedContextAndSchemas(JAXB ContextCache. java: 172)at org. apache. cxf. jaxb。java: 464)在org. apache. cxf. jaxb。java. lang引起的156个以上。C. sun. xml. bind. v2.在org. apache. felix. framework的[我的捆绑包名称][419]中找不到ContextFactory。ModuleInp. findClassOrResourceBy委托(ModuleInp. java: 787)在org. apache. felix. framework。在org. apache. felix. framework.访问400美元(ModuleInv. java: 71)。ModuleImpl$ModuleClassLoader. loadClass(ModuleInp. java: 1768)在java. lang.ClassLoader. loadClass(ClassLoader. java: 248)在javax. xml. bind。下载Spi(ContextFinder. java: 171)

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

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

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

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

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

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

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

共有1个答案

穆彬郁
2023-03-14

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

我没有做一个清单条目来导入CXF总线绑定的cxf.xml,因为它产生了所有这些问题。现在它工作得很好。

 类似资料:
  • 问题内容: 我使用了来自Maven回购的log4j-1.2.17捆绑包。我尝试在捆绑软件中执行此代码(我的捆绑软件调用了log4j-1.2.17捆绑软件) 但是我有错误 捆绑包已按顺序加载 如何解决这个错误?拜托,对不起我的英语。最好的问候,亚瑟。 问题答案: 由于您的Log4j类似乎已由sun.misc类加载器加载,我认为某些东西正在从OSGi外部提供log4j类。有Log4J条目解释了为什么它

  • 我有一个运行在Tomcat 8(Windows 10,JRE 1.8.0_111)上的web应用程序,它实现了一个REST客户端,用于与第三部分REST服务(ADLNET xAPI LRS)通信 当我最近在不同的服务器(CentOS、Tomcat8、Java1.8.0.11)上部署该WAR文件时,应用程序会给出一个ClassNotFound异常: java.lang.ClassNotFoundEx

  • 我正在进行一个使用 spring 3.2.5 .发布hibernate 4.2.15 .最终版karaf 3.0.x 安装自定义包(包含所有实体类)时,<code>抛出PersistentClass名称不能转换为类</code>异常 请在下面找到我的karaf捆绑包列表 查找以下例外 我猜,实体类扫描不正常。这是我的配置 编辑: 请查找以下清单标题条目 我不能解决这个问题。如果任何人有想法,请与我

  • 问题内容: 我试图使用Java中的Apache OAuth Client 2.0 Library自动执行用户级别令牌创建/生成过程(REST /授权授予代码)。以下是我从https://cwiki.apache.org/confluence/display/OLTU/OAuth+2.0+Client+Quickstart获得的正在使用的代码, 但是,我在以下几行中收到了(来自Eclipse中错误的

  • 问题内容: 我已经开始使用Spring学习Apache CXF。首先,我尝试创建一个简单的客户端/服务器模型。 服务器端是: service.HelloWorld.java service.HelloWorldImpl.java 客户端是: client.Client.java 公共类Client { cxf-client-servlet.xml 问题是:要使客户端正常工作,我必须向客户端的项目添

  • 我有一个这样的歌剧API: OpenAPI生成器Maven的插件为schema对象创建了一个请求类“GenerateTokenRequest”,但在API实现类中它没有使用。它生成一个方法,将所有请求的字段作为参数列表。方法如下: 所以,在这种情况下,请求类“GenerateTokenRequest”被生成,但从未使用过。任何人都可以告诉我为什么?有一种使用我的请求类的替代方法吗?我可以在Open