JAX-WS客户端未正确生成API请求

时间:2018-09-11 17:42:48

标签: java web-services wsdl jax-ws wsimport

我有一个为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构造了代理类,但我没有遇到相同的问题。]

0 个答案:

没有答案