在我们不得不升级运行时环境(从 JBOSS/JRE6 到 Tomcat7/JRE7)之前,我继承了一个过去可以正常工作的 Web 服务。除了pom.xml
!之外,没有任何代码更改。
事实上,它仍然可以正常工作,只是许多现有客户端无法再处理响应,因为现在(响应的)元素之一中存在额外的命名空间属性。
也就是说,以前(在迁移之前)该元素(在 SOAP 响应中)曾经是:
<OurResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="OurResponse.xsdXMLSchema-instance"
ourresponseVersion="M1m2v03" xmlns="">
现在是:
<v01:OurResponse acknowledgementVersion="M1m2v03"
xmlns:v01="http://webservice.ourdomain.com/projone/modtwo/M1m2v03">
由于没有涉及代码更改,我对 SOAP 响应中的这种(微小但关键的)更改感到困惑。
特别是,我试图理解:
- 构建系统的哪个部分更改了这个命名空间属性?
- 如何将其恢复到以前的行为?
- 为什么客户会因为如此微小的变化而崩溃?(即响应的内容是相同的!)
我能够在 pom.xml 中发现的唯一相关更改是:
添加以下依赖项:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.0.7.RELEASE</version> <exclusions> <exclusion> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </exclusion> </exclusions> </dependency>
将依赖项从版本 2.2.7 更新
cxf-rt-frontend-jaxws
到 2.7.7。将依赖项从版本 2.2.7 更新
cxf-rt-transports-http
到 2.7.7。将依赖项从版本 2.2.7 更新
cxf-rt-ws-security
到 2.7.7。添加以下依赖项:
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-core</artifactId> <version>2.7.7</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-databinding-aegis</artifactId> <version>2.7.7</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-management</artifactId> <version>2.7.7</version> </dependency>
同样,我假设其中一个在内部处理此问题的框架(CXF?Spring?)发生了一些内部变化。如果这个假设是正确的,那么:
- 构建系统的哪个部分更改了这个命名空间属性?
- 如何将其恢复到以前的行为?
- 为什么客户会因为如此微小的变化而崩溃?(即响应的内容是相同的!)
更新 1: 罪魁祸首原来是 org.apache.cxf 软件包版本从 2. 2 .7 更改为 2. 7 .7。
看起来更新并不总是更好......除非有办法以编程方式方式强制剥离命名空间前缀的遗留行为?
更新 2:在 Tomcat7/JRE7 上使用 CXF 2.2.7 具有在发送单个 SOAP 消息后终止 Tomcat 服务器的副作用(似乎与 SSL 有关)。
像 Tomcat 这样古老的服务器可能会因为单个流氓 .war 包而死掉这一事实非常令人不安,但由于我无法修复 Tomcat,而且我还没有找到解决隐式命名空间前缀问题的编程方法,所以我尝试了各种稳定的 CXF 版本会在不杀死 Tomcat 的情况下表现出遗留行为。
我尝试了 2.7.1 和 2.6.10 版本,但最终只能2.5.9
工作。
我希望这可以帮助遇到类似问题的人。