我目前使用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)
試着用'openejb.classloader.forced-load = javax.ws.rs,...' –
你是說這個值是依賴於順序的,還是你只是想說把它從「javax」中縮短。 ws.rs.client「改爲」javax.ws.rs「?我嘗試過這種變化,並且失敗並出現其他錯誤。 –