У меня есть WSDL, созданный для веб-службы WCF, который имеет комплексный тип DataMember, называемый «Критерии поиска».
В Критериях поиска есть свойство, называемое «Критерии», которое является другим сложным типом ипо существу, массив другого сложного типа "Criteria Node".
Критерии поиска -
<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
Проблема заключается в том, что когда я выполняю вызов веб-службы, которая включает эти объекты, она не соответствует правильнойструктура -
<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>
Почему он сериализуется как "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 # этот метод генерируется правильно, он простосоздает массивf 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;
Вызов, очевидно, завершается неудачно, поскольку веб-служба не может десериализовать «ArrayOfCriteriaNode», когда она ожидает «Критерии».
Чего мне не хватает?
[ОБНОВЛЕНИЕ 1: Я сконструировал прокси-классы, используя Apache Axis 2 WSDL2Java, и у меня нет такой проблемы.]