我正在尝试使用 JAX-WS 和 wsimport 编写一个使用给定 Web 服务的 Java 应用程序。它发送给服务的 SOAP 消息大部分是正确的。但是,传递给服务函数的参数中有一个是字符串数组。尽管在 SOAP XML 中为数组本身提供了适当的名称空间,但元素(下面消息中的“parm”)没有名称空间。这会导致服务失败。
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:Submit xmlns:ns2="http://www.acme.com/service/wsdl">
<ns2:service>SomeJob</ns2:service>
<ns2:parms>
<parm>someparam</parm>
<parm>anotherparam</parm>
</ns2:parms>
</ns2:Submit>
</S:Body>
</S:Envelope>
<parm>
元素应该是 read <ns2:parm>
,或者<Submit>
标签可以定义一个默认名称空间<Submit xmlns="http://www.acme.com/service/wsdl">
(这是服务在示例 SOAP 消息中建议的内容)。
这个问题确实类似于JAX-WS 中的问题:为什么嵌套元素在 "" 命名空间中?. 然而,将样式从 RPC/Literal 更改为 Document/Wrapped 解决了这个问题,而在我的情况下,服务从 Document/Wrapped 开始。
如何说服 JAX-WS 库在数组中的嵌套元素上生成名称空间?
TIA,杰伦
更新:编辑生成的代码似乎有效。有人建议在生成的数组类型中的“parm”定义之前的@XmlElement 行中添加一个命名空间属性:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ArrayOfString", propOrder = {
"parm"
})
public class ArrayOfString {
@XmlElement(nillable = true, namespace="http://www.acme.com/service/wsdl")
protected List<String> parm;
...
}
这会导致 JAX-WS 添加名称空间并且可能会解决问题。由于在这种情况下代码生成只完成一次,因此可以接受编辑生成的代码。我仍然想知道是否没有更好的解决方案。