0

私は、古い SOAP インターフェースの復活に割り当てられた SOAP 初心者です。SOAP サービスを新しい tomcat の新しいパスに移植しました (クライアントは変更しませんでした)。http://myserver:8181/soap/SoapTest?wsdlというリクエストを送信する と、次のように返されます。

  <wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
    xmlns:ns3="http://schemas.xmlsoap.org/wsdl/soap/http"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://www.mycompany.com/SoapTest"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    name="SoapTestService" 
    targetNamespace="http://www.mycompany.com/SoapTest">

    <wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
          namespace="http://webservices.mycompany.com"></wsdl:import>
    <wsdl:binding name="SoapTestServiceSoapBinding" type="ns1:SoapTest">...</wsdl:binding>
    <wsdl:service name="SoapTestService">...</wsdl:service>
  </wsdl:definitions>

有望そうです。インポート場所SoapTest?wsdl=SoapTest.wsdlへのリクエストは、次を返します。

<wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
  xmlns:ns2="http://jaxb.dev.java.net/array" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  name="SoapTest"
  targetNamespace="http://webservices.mycompany.com">
  <wsdl:types>
    <xs:schema xmlns:tns="http://webservices.mycompany.com"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://webservices.mycompany.com" version="1.0">
    <xs:complexType name="sessionObj">
      <xs:sequence>
        <xs:element name="code" type="xs:int"/>
        <xs:element name="id" type="xs:long"/>
        <xs:element minOccurs="0" name="role" type="xs:string"/>
        <xs:element minOccurs="0" name="username" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    ... (and so on)

そのため、クライアントはメンバー xs name:type 関連付けを受け取ることができますが、そうではないか、適用されていないようです。あれは ...

うーん..レビューすると、xsが名前空間として使用されているのがわかりますが、xmlns:xsdが定義されていますか?? これはどのように起こりますか?

このインターフェイス (Linux) への ZSI クライアント クエリ (違いがある場合は Windows から) は、予想されるデータ ペイロードを含む応答を受け取りますが、各データ項目を個別の「プロパティ」にマップします。その結果、一般的なプロパティのリストが生成されます。

各プロパティがその xs 型 (例: int、long、string、上記の文字列) にキャストされた、型指定されたメンバーのリストを期待していましたよね?

手がかりを事前にありがとう。

4

2 に答える 2

1

目前の実際の問題について十分な情報を提供していないことを考えると、私はあなたがnewbであったことに基づいてこれに基づいているため、あなたの質問に関連すると思われる部分に私の答えをラップします.

メイン Web サービスは、親 WSDL へのインポートを保持するWSDL http://myserver:8181/soap/SoapTest?wsdlに記述されています。この親 WSDL は、メイン サービスによってバインドできるサービス定義を保持します。

有望そうです。インポート場所 SoapTest?wsdl=SoapTest.wsdl へのリクエストは次を返します: ..

上記のドキュメント定義から、インポート:

<wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
          namespace="http://webservices.mycompany.com">
</wsdl:import>

サービスに関連するすべての要素と属性のスキーマ定義を保持する親WSDLファイルを挿入します。xsそれへのスタンドアロンの呼び出しを意味すると、名前空間の定義が明らかになります。スキーマとデータ型の詳細については、こちらを参照してください。

うーん..レビューすると、xsが名前空間として使用されているのがわかりますが、xmlns:xsdが定義されていますか?? これはどのように起こりますか?

はい、スキーマは個別のファイルとしてではなく、WSDLの一部として定義されています。<wsdl:types>タグ間で定義されます。

 <wsdl:types>
       <xs:schema xmlns:tns="http://webservices.mycompany.com" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://webservices.mycompany.com" version="1.0">
   [..]
 </wsdl:types>

ZSI バインディングとスタブ生成の詳細については、こちらも参照してください。

于 2012-04-20T17:33:23.577 に答える
0

ZSI ドキュメントから:

呼び出された操作が ComplexType を返す場合、応答を逆シリアル化する方法を ZSI に伝えるために、型コード情報を提供する必要があります。

ZSI が返された複合型を Person インスタンスに透過的に逆シリアル化するには、クラスとその型コードを定義するモジュールを ZSI.Path リストに追加する必要があります。クラスをパラメーターとして Binding.Receive() メソッドに渡すことで、使用するクラスとタイプコードを ZSI に明示的に伝えることもできます。最初の方法は、特に公的に配布されたライブラリの場合に好まれます。

WSDL および XML スキーマからのコード生成は、ZSI が WSDL サービスにアクセスするために提供する 2 つ目の方法です。WSDL サービスへのパスを指定すると、サービスにアクセスするために使用できる「サービス」ファイルと「タイプ」ファイルの 2 つのファイルが生成されます。

于 2012-04-19T11:09:29.390 に答える