4

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

4

1 回答 1

0

您还可以通过添加来影响命名空间的创建

elementFormDefault="qualified"

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

于 2013-03-26T12:54:21.643 回答