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 生成类,则可以选择此选项:
如前所述,此选项将为“某些模式数组模式”创建类,例如我的问题中概述的模式。
如果您使用 Eclipse 生成 Web 服务客户端,您可以通过转到 Eclipse 的首选项下的 Axis Emitter 并选中相应的复选框来配置相同类型的选项。
关于java - 以复杂类型包装的数组在 Java 代码中展开 (Axis 1.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359740/