包含在复杂类型中的数组在Java代码中被解开(Axis 1.4)

p.m*_*ten 4 java serialization axis web-services

WSDL看起来像这样:

<xsd:element name="Parent">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" ref="tns:Child"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

预期的行为

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

public class MyComplexObject {
    private Parent parent;
}
Run Code Online (Sandbox Code Playgroud)

Parent类将包括阵列的Child对象.

public class Parent {
    private Child[] child;
}
Run Code Online (Sandbox Code Playgroud)

实际行为

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

public class MyComplexObject {
    private Child[] parent;
}
Run Code Online (Sandbox Code Playgroud)

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

<Parent>
    ...
</Parent>
<Parent>
    ...
</Parent>
Run Code Online (Sandbox Code Playgroud)

导致服务器端出现故障.似乎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>
Run Code Online (Sandbox Code Playgroud)

看来,在这种情况下,Axis正确创建了一个Parent包装器对象:

public class Parent {
    private String dummy;
    private Child[] child;
}
Run Code Online (Sandbox Code Playgroud)

我的XML输出是正确的:

<Parent>
    <Dummy>...</Dummy>
    <Child>...</Child>
    <Child>...</Child>
</Parent>
Run Code Online (Sandbox Code Playgroud)

所以这似乎是Axis 1.4中的一个错误...

p.m*_*ten 5

我最近找到了解决方案.wsdl2java似乎有一个无证的-w选项,这是一个简写--wrapArrays.如果使用SoapUI生成类,则可以选择此选项:

SoapUI和wsdl2java

如上所述,此选项将为"某些架构阵列模式"创建类,例如我的问题中概述的模式.

如果您正在使用Eclipse生成Web服务客户端,则可以通过转到Eclipse的Preferences下的Axis Emitter并选中相应的复选框来配置相同类型的选项.

Eclipse和wsdl2java