我有一个为WCF Web服务创建的WSDL,它的DataMember复杂类型称为“搜索条件”。
在搜索条件中,有一个称为“条件”的属性,它是另一种复杂类型,本质上是另一种复杂类型“条件节点”的数组。
搜索条件-
<xs:complexType name="SearchCriteria">
<xs:sequence>
<xs:element minOccurs="0" name="Criteria" nillable="true" type="tns:ArrayOfCriteriaNode" />
<xs:element minOccurs="0" name="IncludeBlobData" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
条件(tns:ArrayOfCriteriaNode)-
<xs:complexType name="ArrayOfCriteriaNode">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="CriteriaNode" nillable="true" type="tns:CriteriaNode" />
</xs:sequence>
</xs:complexType>
CriteriaNode-
<xs:complexType name="CriteriaNode">
<xs:sequence>
<xs:element minOccurs="0" name="CompareValues" nillable="true" type="msarray:ArrayOfstring" />
<xs:element minOccurs="0" name="ParamName" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
我正在使用“ wsimport”工具生成客户端-
wsimport -keep -verbose -p com.mp.hbo -B-XautoNameResolution XytechAPI.wsdl >> output.txt
问题是,当我调用涉及这些对象的Web服务时,它没有遵循正确的结构-
<ns3:criteria>
<ArrayOfCriteriaNode>
<CriteriaNode>
<CompareValues>
<ns2:string>B</ns2:string>
</CompareValues>
<ParamName>list_type</ParamName>
</CriteriaNode>
</ArrayOfCriteriaNode>
</ns3:criteria>
预期结构-
<ns3:criteria>
<Criteria>
<CriteriaNode>
<CompareValues>
<ns2:string>B</ns2:string>
</CompareValues>
<ParamName>list_type</ParamName>
</CriteriaNode>
</Criteria>
</ns3:criteria>
为什么当它应该只是“ Criteria”时才序列化为“ ArrayOfCriteria”。
我觉得这是JAX-WS工具中如何生成代理类的问题-
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SearchCriteria", namespace = "http://schemas.datacontract.org/2004/07/Xytech.MP.API", propOrder = {
"criteria",
})
public class SearchCriteria {
@XmlElementRef(name = "Criteria", namespace = "http://schemas.datacontract.org/2004/07/Xytech.MP.API", type = JAXBElement.class, required = false)
protected JAXBElement<ArrayOfCriteriaNode> criteria;
@XmlElement(name = "IncludeBlobData")
protected Boolean includeBlobData;
}
条件类数组-
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ArrayOfCriteriaNode", namespace = "http://schemas.datacontract.org/2004/07/Xytech.MP.API", propOrder = {
"criteriaNode"
})
public class ArrayOfCriteriaNode {
@XmlElement(name = "CriteriaNode", nillable = true)
protected List<CriteriaNode> criteriaNode;
}
由于在C#中,此方法生成正确,因此只需创建一个CriteriaNode数组(CriteriaNode [])-
public partial class SearchCriteria : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
[System.Runtime.Serialization.OptionalFieldAttribute()]
private HBO_PROG03_TEST.HBO_74_PROG03.CriteriaNode[] CriteriaField;
[System.Runtime.Serialization.OptionalFieldAttribute()]
private bool IncludeBlobDataField;
该调用显然失败,因为Web服务在期望“ Criteria”时无法反序列化“ ArrayOfCriteriaNode”。
我想念什么?
[更新1:我使用Apache Axis 2 WSDL2Java构造了代理类,但我没有遇到相同的问题。]