【问题标题】:What is wrong with this WSDL? Why does SOAPUI generate a wrong request from this WSDL?这个 WSDL 有什么问题?为什么 SOAPUI 会从此 WSDL 生成错误请求?
【发布时间】:2017-04-24 12:12:29
【问题描述】:

我的一个 WSDL 有一个奇怪的问题

当我在 SOAPUI 中创建一个新的 SOAP 项目并导入 WSDL 时,SOAPUI 会生成一个示例请求,但该请求缺少操作的命名空间和元素。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <customers>
         <!--Zero or more repetitions:-->
         <customerId>?</customerId>
      </customers>
   </soapenv:Body>
</soapenv:Envelope>

基于我的 WSDL 和 XSD(我将在最后包含以供参考),我希望请求看起来更像这样:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:look="http://noa.otto.de/onlinecustomer/webservice/lookupadditionaldata">
   <soapenv:Header/>
   <soapenv:Body>
    <look:requestAdditionalCustomerData>
          <look:customers>
             <!--Zero or more repetitions:-->
             <look:customerId>?</look:customerId>
          </look:customers>
      </look:requestAdditionalCustomerData>
   </soapenv:Body>
</soapenv:Envelope>

但即使我手动“更正”这样的请求,它也无法工作,并且仍然在服务器端产生 SOAPFault 异常,指出它“无法从 WS 上下文中检索操作名称”

这告诉我问题可能不在于 SOAPUI 从 WSDL 生成正确请求的能力,而在于我定义正确 WSDL 的能力:-)

问题是,我没有更多的想法可以尝试,我已经做了将近两天了。所以我想也许其他人有一个想法。

感谢您的任何想法,并提前感谢您的宝贵时间!

问候 马里奥

哦,万一这很重要,网络服务部署在 glassfish/payara 4.1.1 中

这是我的 WSDL:

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:webservice="http://noa.otto.de/onlinecustomer/webservice/lookupadditionaldata" xmlns:lookupadditionaldata="http://noa.otto.de/onlinecustomer/schema/lookupadditionaldata" name="LookupAdditionalUniservData" targetNamespace="http://noa.otto.de/onlinecustomer/webservice/lookupadditionaldata">
<types>
  <xsd:schema>
    <xsd:import namespace="http://noa.otto.de/onlinecustomer/schema/lookupadditionaldata" schemaLocation="http://blade228.puc.ov.otto.de:52301/onlinecustomer/LookupAdditionalUniservData?xsd=1"/>
  </xsd:schema>
</types>

<message name="requestAdditionalCustomerDataRequest">
    <part name="customers" type="lookupadditionaldata:intArray"/>
</message>

<message name="requestAdditionalCustomerDataResponse">
    <part name="customerData" type="lookupadditionaldata:customerDataArray"/>
</message>

<portType name="LookupAdditionalUniservDataPort">
    <operation name="requestAdditionalCustomerData">
        <input message="webservice:requestAdditionalCustomerDataRequest"/>
        <output message="webservice:requestAdditionalCustomerDataResponse"/>
    </operation>
</portType>

<binding name="LookupAdditionalUniservDataPortBinding" type="webservice:LookupAdditionalUniservDataPort">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="requestAdditionalCustomerData">
        <documentation>collects customer account information for a given list of idCustomers</documentation>
        <soap:operation soapAction="requestAdditionalCustomerData" style="document"/>
        <input>
            <soap:body use="literal"/>
        </input>
        <output>
            <soap:body use="literal"/>
        </output>
    </operation>
</binding>

<service name="LookupAdditionalUniservDataService">
    <documentation>this service provides a means for the CASS/ENS/Uniserv system to collect additional customer account data</documentation>
    <port name="LookupAdditionalUniservDataPort" binding="webservice:LookupAdditionalUniservDataPortBinding">
        <soap:address location="http://blade228.puc.ov.otto.de:52301/onlinecustomer/LookupAdditionalUniservData"/>
    </port>
</service>

</definitions>

这里是 XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://noa.otto.de/onlinecustomer/schema/lookupadditionaldata" targetNamespace="http://noa.otto.de/onlinecustomer/schema/lookupadditionaldata" version="1.0">

    <xs:complexType name="customerData">
        <xs:sequence>
            <xs:element name="accountBalance" type="xs:long" minOccurs="0"/>
            <xs:element name="birthday" type="xs:dateTime" minOccurs="0"/>
            <xs:element name="blockedOrderValue" type="xs:int" minOccurs="0"/>
            <xs:element name="city" type="xs:string" minOccurs="0"/>
            <xs:element name="combinedCreditWorthinessClass" type="xs:short" minOccurs="0"/>
            <xs:element name="companyId" type="xs:short" minOccurs="0"/>
            <xs:element name="creationDate" type="xs:dateTime" minOccurs="0"/>
            <xs:element name="custNo" type="xs:string" minOccurs="0"/>
            <xs:element name="blockades" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="blockade" type="tns:customerBlockade" minOccurs="0" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="dunningLevel" type="xs:string" minOccurs="0"/>
            <xs:element name="email" type="xs:string" minOccurs="0"/>
            <xs:element name="errorMessage" type="xs:string" minOccurs="0"/>
            <xs:element name="externalAccountBlockingSign" type="xs:byte" minOccurs="0"/>
            <xs:element name="externalBlockingSign" type="xs:byte" minOccurs="0"/>
            <xs:element name="externalCustomerType" type="xs:short" minOccurs="0"/>
            <xs:element name="firstName" type="xs:string" minOccurs="0"/>
            <xs:element name="houseNo" type="xs:string" minOccurs="0"/>
            <xs:element name="id" type="xs:int" minOccurs="0"/>
            <xs:element name="lastName" type="xs:string" minOccurs="0"/>
            <xs:element name="openBackorder" type="xs:int" minOccurs="0"/>
            <xs:element name="phone" type="xs:string" minOccurs="0"/>
            <xs:element name="salutation" type="xs:string" minOccurs="0"/>
            <xs:element name="street" type="xs:string" minOccurs="0"/>
            <xs:element name="weeklyCredit" type="xs:long" minOccurs="0"/>
            <xs:element name="zip" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="customerBlockade">
        <xs:sequence>
            <xs:element name="blockadeAge" type="xs:long" minOccurs="0"/>
            <xs:element name="blockadeName" type="xs:string" minOccurs="0"/>
            <xs:element name="blockadeNumber" type="xs:short" minOccurs="0"/>
            <xs:element name="blockadeState" type="tns:blockadeState" minOccurs="0"/>
            <xs:element name="dominantBlockadeSign" type="xs:boolean" minOccurs="0"/>
            <xs:element name="paymentKey" type="xs:byte" minOccurs="0"/>
            <xs:element name="paymentKeyName" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="blockadeState">
        <xs:restriction base="xs:string">
            <xs:enumeration value="ACTIVE"/>
            <xs:enumeration value="SUSPENDED"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="customerDataArray" final="#all">
        <xs:sequence>
            <xs:element name="item" type="tns:customerData" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
        </xs:sequence>
    </xs:complexType>
    <element name="customerDataArray" type="tns:customerDataArray"/>

    <xs:complexType name="intArray" final="#all">
        <xs:sequence>
            <xs:element name="customerId" type="xs:int" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
        </xs:sequence>
    </xs:complexType>
    <element name="intArray" type="tns:intArray"/>

</xs:schema>

【问题讨论】:

  • 您是否多次导入了wsdl?后来又更新了schema定义又重新导入了?
  • 是的,这是一个迭代过程,直到我让 web 服务在服务器端工作,在此期间我多次将 wsdl (ctrl+u) 导入到soap ui。为什么这是相关的?您似乎无法找到解决方案,但我还没有得到它:-)
  • SoapUI 缓存 wsdl/xsd 的定义。可能您在新项目中尝试使用最新的 wsdl,看看行为是否仍然相同或所需的行为。
  • 我试过了。删除了 SOAPUI 项目并从相同的 WSDL URL 创建了一个新项目,但结果是相同的。如果解决方案如此简单,我的手指交叉就好了:-)
  • 我终于找到了导致这个问题的原因。这是 WSDL 中的错误。在两个 定义中,我在 元素中使用属性 type=""。它应该是 element="" 而不是 type="",那么它就可以了。这么小的错误……花了这么多时间找到它。有时我讨厌我的职业:-)

标签: web-services wsdl soapui


【解决方案1】:

我发现了导致此问题的原因。这是 WSDL 中的错误。在两个&lt;message&gt; 定义中,我在&lt;part&gt; 元素中使用属性type=""。它应该是 element="" 而不是 type="",然后它就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多