我在 Apache Geronimo 2.1.3 上有一个 Web 服务应用程序。
我正在使用 JAX-WS,注释 POJOS,使用 SOAP 1.1。 (使用Sun JDK 1.5)
各种客户端都可以顺利使用网络服务。
一个新客户端无法工作。在工作客户端中,只有soapenv:Body 下的子元素具有命名空间声明,并且子元素的子元素没有命名空间声明。在新客户端中,soapenv:Body 的所有后代(包括子级的子级)都具有命名空间声明。
本质上,这是有效的:
<soapenv:Body>
<ns1:Echo>
<Message>Hello world</Message>
...
但这并不:
<ns1:Echo>
<ns1:Message>Hello world</ns1:Message>
...
登录应用程序会显示 Message 为 null,而不是“Hello world”
这个“坏”请求可以吗?看起来它符合 WS-I Basic Profile?
客户端程序无法更改。有没有办法让我覆盖某些东西,让这个请求的两个版本都起作用?
最佳答案
Message
和ns1:Message
是不同的类型,就像虚构的 java 类 Message
和ns1.Message
。服务器期望 Message
在默认命名空间中声明的元素(某处应该有 xmlns="<my.default.namespace.name>"
),但它得到 <ns1:Message>
并简单地忽略它。
如果您无法强制客户端发送有效的 xml Soap 消息(根据 wsdl),您可以尝试更改服务器代码以使其接受 <Message>
元素以及 <ns1:Message>
元素为<ns1:Echo>
children 。您必须为 ns1
中的元素声明类型。命名空间并添加 choice
元素到<ns1:Echo>
声明。
关于java - SOAP 体、命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4087692/