【问题标题】:ERROR: java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory错误:java.lang.ClassCastException:类 org.apache.cxf.bus.spring.SpringBusFactory
【发布时间】:2011-11-08 15:00:09
【问题描述】:

喂!

我正在尝试使用 CXF 创建一个 Web 服务客户端。我的应用程序在 OSGi 中。我使用 Felix 框架。

但是出现以下错误:

[main] ERROR org.apache.cxf.BusFactory - Failed to determine BusFactory implementation class name.
java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory
    at java.lang.Class.asSubclass(Unknown Source)
    at org.apache.cxf.BusFactory.getBusFactoryClass(BusFactory.java:280)
    at org.apache.cxf.BusFactory.newInstance(BusFactory.java:207)
    at org.apache.cxf.BusFactory.newInstance(BusFactory.java:194)
    at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:90)
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:137)
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:122)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:89)
    at javax.xml.ws.Service.<init>(Service.java:36)
    at myorg.engine.test.mocks.soapservice.client.CHMService.<init>(CHMService.java:42)
    at myorg.engine.service.OSGiServiceTest.testSoapServiceMock(OSGiServiceTest.java:133)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.injectContextAndInvoke(ProbeInvokerImpl.java:112)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.findAndInvoke(ProbeInvokerImpl.java:71)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.call(ProbeInvokerImpl.java:58)
    at org.ops4j.pax.exam.nat.internal.NativeTestContainer.call(NativeTestContainer.java:83)
    at org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactor.invoke(EagerSingleStagedReactor.java:85)
    at org.ops4j.pax.exam.junit.JUnit4TestRunner$2.evaluate(JUnit4TestRunner.java:259)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.ops4j.pax.exam.junit.JUnit4TestRunner.run(JUnit4TestRunner.java:86)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

[main] ERROR org.apache.cxf.BusFactory - Failed to instantiate bus factory.
java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory
    at java.lang.Class.asSubclass(Unknown Source)
    at org.apache.cxf.BusFactory.newInstance(BusFactory.java:218)
    at org.apache.cxf.BusFactory.newInstance(BusFactory.java:194)
    at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:90)
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:137)
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:122)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:89)
    at javax.xml.ws.Service.<init>(Service.java:36)
    at myorg.engine.test.mocks.soapservice.client.CHMService.<init>(CHMService.java:42)
    at myorg.engine.service.OSGiServiceTest.testSoapServiceMock(OSGiServiceTest.java:133)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.injectContextAndInvoke(ProbeInvokerImpl.java:112)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.findAndInvoke(ProbeInvokerImpl.java:71)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.call(ProbeInvokerImpl.java:58)
    at org.ops4j.pax.exam.nat.internal.NativeTestContainer.call(NativeTestContainer.java:83)
    at org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactor.invoke(EagerSingleStagedReactor.java:85)
    at org.ops4j.pax.exam.junit.JUnit4TestRunner$2.evaluate(JUnit4TestRunner.java:259)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.ops4j.pax.exam.junit.JUnit4TestRunner.run(JUnit4TestRunner.java:86)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
[org.ops4j.pax.exam.junit.JUnit4TestRunner] : Exception
org.ops4j.pax.exam.TestContainerException: java.lang.reflect.InvocationTargetException
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.injectContextAndInvoke(ProbeInvokerImpl.java:118)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.findAndInvoke(ProbeInvokerImpl.java:71)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.call(ProbeInvokerImpl.java:58)
    at org.ops4j.pax.exam.nat.internal.NativeTestContainer.call(NativeTestContainer.java:83)
    at org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactor.invoke(EagerSingleStagedReactor.java:85)
    at org.ops4j.pax.exam.junit.JUnit4TestRunner$2.evaluate(JUnit4TestRunner.java:259)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.ops4j.pax.exam.junit.JUnit4TestRunner.run(JUnit4TestRunner.java:86)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.ops4j.pax.exam.raw.extender.intern.ProbeInvokerImpl.injectContextAndInvoke(ProbeInvokerImpl.java:112)
    ... 20 more

Caused by: java.lang.RuntimeException: java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory
    at org.apache.cxf.BusFactory.newInstance(BusFactory.java:224)
    at org.apache.cxf.BusFactory.newInstance(BusFactory.java:194)
    at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:90)
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:137)
    at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:122)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:89)
    at javax.xml.ws.Service.<init>(Service.java:36)
    at myorg.engine.test.mocks.soapservice.client.CHMService.<init>(CHMService.java:42)
    at myorg.engine.service.OSGiServiceTest.testSoapServiceMock(OSGiServiceTest.java:133)
    ... 25 more

Caused by: java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory
    at java.lang.Class.asSubclass(Unknown Source)
    at org.apache.cxf.BusFactory.newInstance(BusFactory.java:218)
    ... 33 more

我说这可能是因为不同的 ClassLoader。有可能吗?

知道如何解决这个问题吗?

谢谢!

【问题讨论】:

    标签: java web-services osgi webclient cxf


    【解决方案1】:

    是的,看起来您有两个 BusFactory 类定义。 SpringBusFactory 实现其中一个,而 asSubclass() 调用是在另一个上进行的。由于一个 BusFactory 与另一个不同,因此您将获得 CCE。查找包含 BusFactory 类的两个不同包。其中之一将由定义 SpringBusFactory 的包导入。

    【讨论】:

    • Felix 中没有两个 BusFactory 类的实现。只有 cxf 捆绑包。而且我的包没有导入类 SpringBusFactory,只有 javax.xml.ws.Service 类。
    【解决方案2】:

    我认为“两个 BusFactory 类定义”是一个红鲱鱼。

    不确定您使用的是哪个版本的 CXF(猜测是 2.4.2),但该代码在查找子类实现时尝试使用线程上下文类加载器执行 ServiceLoader 之类的事情。

    我最好的猜测是 CXF 依赖于一些 Spring“魔法”,而您缺少提供它的包。查看 Karaf 的 CXF 功能,它有很多依赖项,检查并确保您拥有所有依赖项 - 此时使用安装了 CXF 功能的 karaf 可能会更容易尝试。

    如果您使用的是 maven,可以通过以下方式访问功能文件:

        <dependency>
            <groupId>org.apache.cxf.karaf</groupId>
            <artifactId>apache-cxf</artifactId>
            <version>2.4.2</version>
            <type>xml</type>
            <classifier>features</classifier>
        </dependency>
    

    一些关于总线配置的文档here

    【讨论】:

    • 我发现 SOAP 客户端在 OSGi 环境中不能与 CXF 一起使用。
    【解决方案3】:

    我过去曾在 pax-exam 中看到过类似的奇怪错误。这是否在“正常”OSGi 环境中的 pax-exam 之外运行? Talend Service Factory (http://talend.com/products/tsf) 有几个在 OSGi 中运行的 CXF 客户端和服务示例(在单独的示例下载包中),它们都可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多