2017-03-10 169 views
1

我目前使用CXF 3.1.9和4.3.5春季在搖籃建立了一個應用程序,並在運行Tomcat 8(TomEE 7.0.1)。獲得「java.lang.ClassCastException:類org.apache.cxf.bus.spring.SpringBusFactory」在TomEE

我目前只指定了以下明確的CXF的依賴關係:

['cxf-rt-rs-extension-providers', 'cxf-rt-management'].each { 
    compile "org.apache.cxf:${it}:3.1.9" 
} 

這得到及物其他幾個文物,包括CXF核心。

截至目前,該應用程序剛剛REST服務請求,並一直工作正常。我現在試圖使用ClientBuilder將一個簡單的請求添加到另一個服務中。當我嘗試發送消息時,我得到這個:

SEVERE: Failed to determine BusFactory implementation class name. 
java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory 
    at java.lang.Class.asSubclass(Class.java:3404) 
    at org.apache.cxf.BusFactory.getBusFactoryClass(BusFactory.java:390) 

我注意到,其他一些人已經獲得了類似的錯誤,但我沒有看到一個解決方案,是有道理的,我的情況。

更新

我想這裏有一個類加載衝突,所以我打開詳細的類加載,和我看到被加載無論從我的web應用程序的WEB-INF/lib目錄CXF類,並從容器中的「 lib「目錄,特別是」BusFactory「類。

不過,我相信我有所有適當的設置,以說服TomEE從Web應用程序加載,而不是容器中的所有CXF類。我有「openejb.classloader.forced負荷= org.springframework,org.apache.cxf」在Eclipse中的服務器定義的「system.properties」文件,我有「禁用=真」,在「cxf.properties」和「cxf-rs.properties」放在同一個地方。

更新

我也注意到,當我第一次提到「ClientBuilder」,它是從裝載容器的lib那類,所以我嘗試添加「javax.ws.rs.client」到「強制加載「列表。不幸的是,這只是產生了一個不同的異常:

org.apache.cxf.interceptor.Fault: ClassCastException: attempting to castjar:file:.../apache-tomee-webprofile-7.0.1/lib/javaee-api-7.0.jar!/javax/ws/rs/client/ClientBuilder.class to jar:file:.../.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/uslMonitorService/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/client/ClientBuilder.class 
    at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162) 
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128) 
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:189) 
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:99) 
    ... 
Caused by: java.lang.LinkageError: ClassCastException: attempting to castjar:file:.../apache-tomee-webprofile-7.0.1/lib/javaee-api-7.0.jar!/javax/ws/rs/client/ClientBuilder.class to jar:file:.../.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/uslMonitorService/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/client/ClientBuilder.class 
    at javax.ws.rs.client.ClientBuilder.newBuilder(ClientBuilder.java:97) 
    at javax.ws.rs.client.ClientBuilder.newClient(ClientBuilder.java:114) 
+0

試着用'openejb.classloader.forced-load = javax.ws.rs,...' –

+0

你是說這個值是依賴於順序的,還是你只是想說把它從「javax」中縮短。 ws.rs.client「改爲」javax.ws.rs「?我嘗試過這種變化,並且失敗並出現其他錯誤。 –

回答

0

我覺得TomEE加超薄封裝了CXF庫,所以也許你需要聲明的CXF依賴的範圍provided,而不是compile

+0

這會讓我完全走向另一個方向。我正在嘗試不使用容器提供的庫。 –

+0

在任何情況下,我試過了,雖然gradle這個類似的配置是「compileOnly」,但同樣,這只是造成其他錯誤,比如「NoClassDefFoundError的:組織/ springframework的/豆/工廠/ XML/NamespaceHandlerSupport」,這甚至陌生人因爲早期的輸出之我見「[加載org.springframework.beans.factory.xml.NamespaceHandlerSupport從文件:... /元/ .plugins/org.eclipse.wst.server.core/TMP1/wtpwebapps/uslMonitorService/WEB-INF/LIB /彈簧豆-4.3.5.RELEASE.jar]」。 –