java - 以复杂类型包装的数组在 Java 代码中展开 (Axis 1.4)

标签 java web-services serialization axis

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 中的一个错误...

最佳答案

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

SoapUI and wsdl2java

如前所述,此选项将为“某些模式数组模式”创建类,例如我的问题中概述的模式。

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

Eclipse and wsdl2java

关于java - 以复杂类型包装的数组在 Java 代码中展开 (Axis 1.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359740/

相关文章:

java - 如何获取 server.log 文件中的日志条目以在 jsf 页面上打印出来

java - 设置jruby jvm而不更改JAVA_HOME

java - 如果我想在 arraylist 中搜索一个元素,那 Big-Theta 是什么?

c# - Asp.Net Ajax WebService 和内部错误 500

java - 在java中序列化对象的Map或List是否更有效?

c# - ProtoBuf-Net错误: No serializer defined for type of inner class

java - 如何以对未闭合的双引号字符具有鲁棒性的方式解析大型 CSV 文件?

vb.net - WCF 错误 - 接收对 http ://localhost:50750/*******. svc 的 HTTP 响应时发生错误

c# - WCF - 尝试接收大型数据列表时出错(~5000 个对象)

java - java中反序列化对象