Клиент JAX-WS неправильно генерирует запрос API - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть 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, и у меня нет такой проблемы.]

...