【发布时间】:2020-05-17 20:02:38
【问题描述】:
我有一个部署在 WebSphere 9.0.5.2 上的应用程序,我想在其中使用 CXF 进行 Web 服务调用,但我收到了 This ServiceConfigurationError
WrapperedException { java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.apache.cxf.jaxws.spi.ProviderImpl could not be instantiated
进一步向下堆栈跟踪,我发现这是由 LinkageError 引起的
Caused by: java.lang.LinkageError: loading constraint violation when overriding method
"javax/xml/ws/spi/ServiceDelegate.createDispatch(Ljavax/xml/namespace/QName;Ljavax/xml/bind/JAXBContext;Ljavax/xml/ws/Service$Mode;)Ljavax/xml/ws/Dispatch;" during creation of class
"org/apache/cxf/jaxws/ServiceImpl": loader
"com/ibm/ws/classloader/CompoundClassLoader@832133d2" of class
"org/apache/cxf/jaxws/ServiceImpl" and loader
"com/ibm/oti/vm/BootstrapClassLoader@2eec706a" of class
"javax/xml/ws/spi/ServiceDelegate" have different types for the method signature
我知道这可能是由于多个库对 QName 或 JAXBContext 有不同的定义,但我想我已经排除了这些。
我也知道 WebSphere 有它自己的 JAX-WS 和它自己的 ServiceDelegate.createDispatch 方法签名,我已经尝试按照此处的说明在 WebSphere 中将 DisableIBMJAXWSEngine 设置为 true
Using a third-party JAX-WS web services engine
我仍然无法摆脱错误,并且对于接下来要尝试什么感到茫然。任何建议表示赞赏!!!
【问题讨论】:
-
您的应用程序中是否有 JAX-WS 和/或 JAXB API 的副本,或者只有 CXF 实现?看起来正在发生的事情是某种交叉链接(我的阅读是 impl 引用 WAS 中的 API,然后 API 引用 WAS 中的 JAXB,而 impl 引用您的应用程序中的 JAXB)。如果我的猜测是正确的,您可以通过从应用程序中删除 JAXB(或共享库,但是您正在加载最后一个父类)或向其中添加 JAX-WS API 来解决此问题。
-
@Jarid 我有 cxf 库和 jaxb 库。我尝试删除 jaxb 库,但似乎需要它们,因为我无法再启动我的应用程序。我的库列表中没有看到 JAX-WS。
-
如果您删除 JAXB API,您会遇到什么具体错误? JAXB 已经包含在 WAS 中很长时间了,除非您依赖于非常特定的版本。
-
@Jarid 事实证明,您将 JAX-WS api 添加到我的应用程序的建议解决了这个问题。如果您将其发布为答案,我会检查它,以便您获得信用。感谢您的帮助!!!
-
完成! (另外,感谢您的建议,很高兴听到您已经启动并运行!)我还添加了对交联机制的更全面的技术描述,以防其他人在将来阅读此问题时有所帮助.
标签: java websphere jax-ws linkageerror