【问题标题】:Getting "java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory" in TomEE在 TomEE 中获取“java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory”
【发布时间】:2017-03-10 00:03:41
【问题描述】:

我目前在使用 Gradle 构建并在 Tomcat 8 (TomEE 7.0.1) 中运行的应用中使用 CXF 3.1.9 和 Spring 4.3.5。

我目前只指定以下显式 CXF 依赖项:

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

这会传递其他几个工件,包括 cxf-core。

到目前为止,该应用程序一直在处理 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)

我注意到其他一些人也遇到了类似的错误,但我没有找到适合我的情况的解决方案。

更新

我认为这里存在类加载冲突,所以我打开了详细类加载,我确实看到 CXF 类正在从我的 webapp WEB-INF/lib 和容器的“lib”目录,特别是“BusFactory”中加载类。

但是,我相信我拥有所有正确的设置来说服 TomEE 从 web 应用程序而不是容器加载所有 CXF 类。我在 Eclipse 的服务器定义的“system.properties”文件中有“openejb.classloader.forced-load=org.springframework,org.apache.cxf”,在“cxf.properties”中有“disabled=true”和“cxf-rs.properties”在同一个地方。

更新

我还注意到,在我第一次引用“ClientBuilder”时,它会从容器的库中加载该类,因此我尝试将“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,...
  • 您是说 this 的值取决于顺序,还是您只是说将其从“javax.ws.rs.client”缩短为“javax.ws.rs”?我尝试了此方法的变体,但由于其他错误而失败。

标签: java spring cxf apache-tomee tomee-7


【解决方案1】:

我认为 TomEE-plus 配置文件将 cxf 库打包,因此您可能需要将 cxf 依赖项的 范围 声明为 provided 而不是 compile

【讨论】:

  • 这将带我走向完全不同的方向。我试图不使用容器提供的库。
  • 无论如何,我试过了,虽然 gradle 的类似配置是“compileOnly”,但同样,这只是导致其他错误,比如“NoClassDefFoundError: org/springframework/beans/factory/xml/ NamespaceHandlerSupport”,这更奇怪,因为在前面的输出中我看到“[Loaded org.springframework.beans.factory.xml.NamespaceHandlerSupport from file:.../.metadata/.plugins/org.eclipse.wst.server.core /tmp1/wtpwebapps/uslMonitorService/WEB-INF/lib/spring-beans-4.3.5.RELEASE.jar]".
猜你喜欢
  • 2011-11-08
  • 2023-01-28
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多