CXF 服务调用因意外命名空间上的解组错误而失败

CXF service call failing with unmarshalling error on unexpected namespace

我 运行 突然遇到了 CXF (2.7.18) 的问题。我 运行 在 Tomcat 8.0.28 和 JDK 1.8.0_66.

问题是最近我们开始发现它不接受具有适当 headers 的服务调用的问题。问题是它适用于某些系统,但不适用于其他系统。

故障表现如下:

Unmarshalling Error: unexpected element (uri:"http://www.namedomain.com", local:"loginRequest"). Expected elements are <{https://www.namedomain.com}loginRequest>

请注意,意外元素是正确命名空间的元素。 "Expected" 元素不正确 - CXF 或管道中的其他东西正在将名称空间 URI 重新映射到 'https'

任何可能导致此问题的线索以及如何纠正它?

我能够确定问题所在。这是我们之前的测试中从未出现过的奇怪现象。

这里是总的总结。使用此 WSDL 的相关应用程序根据定义生成绑定并将其放置在包 'com.foo'.

该应用程序还依赖于另一个 WSDL 端点,但该模块是单独构建的,但具有冲突的包名称 'com.foo'。

在我们之前的测试中,这从未出现过。

在某些时候,在迁移到 Java 8 和 Tomcat 8 时,这个问题会间歇性地出现在某些机器上,但不会出现在其他机器上。我们使用的 VM 映像会影响加载顺序。这并不是说我们依赖加载顺序,只是我们从未见过碰撞。

外部库和应用程序库都有一个包-info.java,其中 XmlSchema 注释的名称空间定义存在冲突。加载顺序 "changed" 在 Java 8 / Tomcat 8 下的某个点使碰撞明显。加载的第一个包信息被缓存导致错误。

解决方案是改变应用程序生成的 WSDL 绑定代码,将其放在另一个包中,避免冲突。