有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用复杂类型包装的web服务数组在Java代码中展开(Axis 1.4)

WSDL如下所示:

<xsd:element name="Parent">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" ref="tns:Child"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

预期行为

如果我让Axis 1.4基于WSDL生成Java代码,我希望我的对象中有以下字段:

public class MyComplexObject {
    private Parent parent;
}

Parent类将由一个Child对象数组组成

public class Parent {
    private Child[] child;
}

实际行为

实际行为是直接在父对象级别上定义Child对象的列表:

public class MyComplexObject {
    private Child[] parent;
}

当我们通过填充数组来调用webservice时,它将生成以下XML:

<Parent>
    ...
</Parent>
<Parent>
    ...
</Parent>

导致服务器端出现故障。Axis似乎难以处理复杂类型的嵌套数组。有人面临同样的问题,并且知道任何解决方法/修复方法吗

发现

经过一些调查后,我通过向XSD定义中添加一个虚拟字段来产生预期的行为:

<xsd:element name="Parent">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="Dummy" type="xsd:string"/>
            <xsd:element maxOccurs="unbounded" ref="tns:Child"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

在这种情况下,Axis似乎正确地创建了Parent包装器对象:

public class Parent {
    private String dummy;
    private Child[] child;
}

我的XML输出是正确的:

<Parent>
    <Dummy>...</Dummy>
    <Child>...</Child>
    <Child>...</Child>
</Parent>

看来这真的是Axis 1.4中的一个bug


共 (1) 个答案

  1. # 1 楼答案

    我最近找到了一个解决办法wsdl2java似乎有一个未记录的-w选项,它是 wrapArrays的缩写。如果使用SoapUI生成类,则可以选择以下选项:

    SoapUI and wsdl2java

    如上所述,此选项将为“特定模式数组模式”创建类,如我问题中概述的模式

    如果使用Eclipse生成web服务客户机,可以通过转到Eclipse首选项下的Axis发射器并选中相应的复选框来配置相同的选项

    Eclipse and wsdl2java