我正在开发一个JAVA(Spring3)MW项目,该项目调用其他后端Web服务。但是,有些SOAP消息'''格式错误''''(我认为),我无法追查问题所在。
我不太清楚我应该包含哪些细节,但这里有一些可能很方便:它是一个使用Spring3的JAVA6项目,并且部署在Tomcat 8上用于测试目的。
这是一个类似于我的代码生成的消息的SOAP示例:
<S:Envelope
xmlns:S="http://schemas.xmlsoap.org/soap/">
<S:Body xmlns="http://backend.company.com/">
<GetCustomerInfo>
<MsgHeader>
<SomeTag>some value</SomeTag>
</MsgHeader>
<Body>
<CustomerId>123456</CustomerId>
</Body>
</GetCustomerInfo>
</S:Body>
</S:Envelope>
当我将此SOAP消息发送到后端Web服务时,收到以下错误:
Exception: : Element must have a namespace specified if there is a default namespace in scope : Body
当我按如下方式更改消息时,一切都神奇地开始工作。唯一的区别是我为Soap body元素定义了命名空间。
<S:Envelope
xmlns:S="http://schemas.xmlsoap.org/soap/>
<S:Body>
<GetCustomerInfo xmlns="http://backend.company.com/">
<MsgHeader>
<SomeTag>some value</SomeTag>
</MsgHeader>
<Body>
<CustomerId>123456</CustomerId>
</Body>
</GetCustomerInfo>
</S:Body>
</S:Envelope>
我有11个问题:
(1)我的初始消息与XML一致性有关吗?他们看起来都和我很相似。
(10)我的代码中的哪个库将我的JAVA对象转换为XML消息?我的配置中需要做哪些更改才能生成类似后一个示例的SOAP消息?
(11)在我的第一个XML文件中,我的第一个Body标签的“扩展名称”是什么?会是http://schemas.xmlsoap.org/soap/:Body
还是http://backend.company.com/:Body
?
如果它是相关的,我的代码调用的服务类将使用以下标记进行注释:
@WebService(
targetNamespace = "http://backend.company.com/",
name = "MyServiceName"
)
@XmlSeeAlso({ObjectFactory.class})
@SOAPBinding(
parameterStyle = ParameterStyle.BARE
)
答案 0 :(得分:0)
行。终于找到了我的问题的答案。 Web应用程序将JAVA对象传递给JDK运行时库以进行解组。 JDK使用JDK运行时的JAX-WS RI来实际构建SOAP消息。
显然问题是由客户端和服务器之间的JDK版本不匹配引起的。
最初我使用JDK1.8启动了Tomcat,默认情况下JDK 1.8使用JAX-WS RI 2.2.9进行编组/解组。
另一方面,服务器使用的是JDK1.7,它使用JAX-WS RI 2.2.4来编组/解组SOAP消息。
当我切换到JDK1.7时,我的所有问题都解决了。
请注意,这与我们用于编译源代码的JDK无关,但与用于运行代码的运行时JDK版本有关。
BTW,这两条消息都是有效且功能相同的XML消息。只是早期版本不同意。