我正在尝试使用 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>
The <parm>
元素应该读过<ns2:parm>
,或者替代地<Submit>
标签可以定义默认名称空间<Submit xmlns="http://www.acme.com/service/wsdl">
(这是服务在示例 SOAP 消息中建议的内容)。
这个问题确实类似于JAX-WS:为什么嵌套元素位于“”命名空间中? https://stackoverflow.com/questions/5793352/jax-ws-why-nested-elements-are-in-namespace。然而,将样式从 RPC/Literal 更改为 Document/Wrapped 解决了问题,而在我的例子中,服务一开始就是 Document/Wrapped。
如何说服 JAX-WS 库在数组中的嵌套元素上生成名称空间?
TIA,
杰罗恩
Update:编辑生成的代码似乎有效。有人建议在生成的数组类型中“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 添加命名空间,并且可能会解决该问题。在这种情况下,由于代码生成仅完成一次,因此编辑生成的代码是可以接受的。我还是想知道是否没有更好的解决方案。