2011-09-01 51 views
1

直升機!錯誤:java.lang.ClassCastException:類org.apache.cxf.bus.spring.SpringBusFactory

我試圖創建一個使用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。可能嗎?

任何想法如何解決這個問題?

謝謝!

回答

0

是的,它看起來就像你有兩個BusFactory類定義。 SpringBusFactory實現其中的一個,而asSubclass()調用則在另一個上進行。由於一個BusFactory與另一個BusFactory不同,你會得到一個CCE。查找包含BusFactory類的兩個不同的包。其中一個將由定義SpringBusFactory的包導入。

+0

Felix中沒有兩個類BusFactory的實現。只有cxf-bundle。而我的bundle不導入類SpringBusFactory,只有javax.xml.ws.Service類。 – user923957

0

我認爲「兩所BusFactory類定義」是一個紅色的鯡魚。

不確定您使用的CXF版本是什麼(猜測2.4.2),但該代碼在尋找子類實現時嘗試使用線程上下文類加載器來執行ServiceLoader類。

我最好的猜測是有一些春「神奇」的是CXF依賴於你的缺失,提供它的包。查看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

+1

我發現SOAP客戶端在OSGi環境中不適用於CXF。 – user923957

+0

Hi @ user923957你能解決這個問題嗎? – udi

0

我已經看到了奇怪的錯誤,如與在PAX-考試過去。這是否在「正常」OSGi環境下的pax考試之外運行? Talend Service Factory(http://talend.com/products/tsf)有幾個CXF客戶端和服務在OSGi中運行的示例(在單獨的示例下載包中),它們都可以工作。

相關問題