我正在尝试使用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>
元素应该已读<ns2:parm>
,或者<Submit>
标记可能已定义默认命名空间<Submit xmlns="http://www.acme.com/service/wsdl">
(这是服务在示例SOAP中的建议)消息)。
这个问题与JAX-WS: why nested elements are in "" namespace?中的问题类似。但是,将样式从RPC / Literal更改为Document / Wrapped解决了这个问题,而在我的情况下,服务是Document / Wrapped开头。
如何说服JAX-WS库在数组中的嵌套元素上生成名称空间?
TIA, 的Jeroen
更新:编辑生成的代码似乎有效。有人建议在生成的数组类型中定义'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添加命名空间,并可能解决问题。在这种情况下,代码生成仅执行一次,编辑生成的代码是可以接受的。我仍然想知道是否有更好的解决方案。
答案 0 :(得分:0)
您还可以通过添加
来影响名称空间的创建elementFormDefault="qualified"
对您的Java @XmlSchema
注释 - 或者在您的情况下 - 到定义服务的XSD。