用复杂类型包装的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 楼答案
我最近找到了一个解决办法
wsdl2java
似乎有一个未记录的-w
选项,它是wrapArrays
的缩写。如果使用SoapUI生成类,则可以选择以下选项:如上所述,此选项将为“特定模式数组模式”创建类,如我问题中概述的模式
如果使用Eclipse生成web服务客户机,可以通过转到Eclipse首选项下的Axis发射器并选中相应的复选框来配置相同的选项