我目前正在使用gradle构建的应用程序中使用CXF 3.1.9和Spring 4.3.5,并在Tomcat 8中运行(Tomee 7.0.1)。
i当前仅指定以下明确的CXF依赖项:
['cxf-rt-rs-extension-providers', 'cxf-rt-management'].each {
compile "org.apache.cxf:${it}:3.1.9"
}
这将获得其他几个文物,包括CXF核。
到目前为止,该应用程序一直在提供休息请求,并且运行良好。我现在尝试使用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)
我注意到其他一些人也遇到了类似的错误,但我看不到解决方案对我的情况有意义。
更新:
我认为这里有一个类别的冲突,所以我打开了冗长的classloading,并且我确实看到CXF类从我的WebApp Web-Inf/lib和容器的" Lib"目录,特别是" BusFactory"中加载。班级。
但是,我相信我有所有适当的设置可以说服托梅从WebApp加载所有CXF类,而不是容器。我在eclipse中的" system.properties"文件中有" openejb.classloader.forced-load = org.springframework,org.apache.cxf"中的" system.properties"文件,并且我在" cxf.properties"中in cxf.properties"中的" disabled = true"one_answers" CXF-RS.Properties"在同一地方。
更新:
我还注意到,当我首次提到"客户端构造器"时,它正在加载该类中的集装箱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)
我认为tomee-plus配置文件包装cxf库,所以也许您需要将cxf依赖的 scope 声明为 provided
而不是 compile
。