我有一个从JAX-WS 2.1调用的ASP.NET 2.0 Web服务。如果我使用SOAP UI测试它是否有效。 SOAP UI生成表单
的请求<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sup="abc.123">
<soapenv:Header/>
<soapenv:Body>
<sup:Method>
<sup:element>GBA</sup:element>
<sup:attributes>
<sup:Attribute>
<sup:attributeName>XYZ</sup:attributeName>
<sup:attributeValue>123</sup:attributeValue>
</sup:Attribute>
</sup:attributes>
<sup:nop>abc</sup:nop>
<sup:data>1</sup:data>
</sup:Method>
</soapenv:Body>
</soapenv:Envelope>
这正常,Web服务接收并正确处理数据。但是,JAX-WS客户端会创建表单
的请求<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Method xmlns="abc.123">
<element>
<name>GBA</name>
</element>
<attributes>
<Attribute>
<attributeName>XYZ</attributeName>
<attributeValue>123</attributeValue>
</Attribute>
</attributes>
<nop>abc</nop>
<data>1</data>
</Method>
</soapenv:Body>
</soapenv:Envelope>
这不能正常工作。 ASP.NET Web服务将除 element
之外的所有参数解释为null
。显然这会导致处理失败。 JAX-WS代理返回并正确解释消息。
如何强制JAX-WS(在客户端生成或代码中)使用命名空间前缀?或者有一种方法告诉ASP.NET如何解释SOAP消息原样?
到目前为止,我已经阅读了JAX-WS,它接口有很多选项可以自定义创建的java,但是我没有找到任何参数或绑定规则来定制它如何创建SOAP。
我发现的唯一看起来很有希望的是使用SoapHandler
手动编辑xml构造,如this answer中所建议的那样。然而,这涉及编写代码以遍历DOM并将前缀添加到每个节点。我还没有成功测试过这个选项...
答案 0 :(得分:0)
<element>
属性在第一条消息和第二条消息之间有所不同。这将是问题的根源。
SOAP UI:
...
<sup:element>GBA</sup:element>
JAX-WS:
....
<element>
<name>GBA</name>
</element>
xml名称空间是等效的。元素名称本身不同。
答案 1 :(得分:0)
客户端是使用旧版本的WSDL生成的。使用当前版本的WSDL更正了问题。
始终检查以确保客户端和服务器的WSDL匹配。