使用JAX-WS的SOAP消息中的嵌套标记中没有名称空间

时间:2013-03-25 13:58:35

标签: java web-services soap jax-ws

我正在尝试使用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添加命名空间,并可能解决问题。在这种情况下,代码生成仅执行一次,编辑生成的代码是可以接受的。我仍然想知道是否有更好的解决方案。

1 个答案:

答案 0 :(得分:0)

您还可以通过添加

来影响名称空间的创建
elementFormDefault="qualified"

对您的Java @XmlSchema注释 - 或者在您的情况下 - 到定义服务的XSD。