1

サーバー側に手を加えずに、クライアントをaxis1.xからaxis2-1.6.2に更新しようとしています。Webサービスは、ZSIWebサービスプラットフォームによってPythonに実装されます。クライアントは、WSDL2JavaツールとXMLBeansデータバインディングを使用して、古いwsdlファイルで正常に生成されました。

古いWebサービスにリクエストを送信しているときに問題が発生しましたが、新しいaxis2クライアントは、古いサーバーで予期されているxsi:type属性が欠落しているリクエストを作成し、その結果、サーバーはAnyを返します。型なし要素エラーを解析できません。

新しい古いリクエストは次のようになります

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:getSearchResult xmlns:ns1="http://www.iphrase.com/2003/11/oneStep/" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<arg xsi:type="xsd:string">
test
</arg>
</ns1:getSearchResult>
</soapenv:Body>
</soapenv:Envelope>

新しいものは

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ones:getSearchResult xmlns:ones="http://www.iphrase.com/2003/11/oneStep/">
<arg>
test
</arg>
</ones:getSearchResult>
</soapenv:Body>
</soapenv:Envelope>

ご覧のとおり、「arg」パラメーターにxsi:type = "xsd:string"がありません。これが、主な問題だと思います。

ここでより技術的な詳細:

wsdlは次のようになります

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:types="http://www.iphrase.com/2003/11/oneStep/encodedTypes"
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:tns="http://www.iphrase.com/2003/11/oneStep/"
  xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
  targetNamespace="http://www.iphrase.com/2003/11/oneStep/"
  xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
  <xsd:schema targetNamespace="http://www.iphrase.com/2003/11/oneStep/encodedTypes">
    <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
    <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />


<xsd:simpleType name="arg">
  <xsd:restriction base="xsd:string">
  </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="out">
  <xsd:restriction base="xsd:string">
  </xsd:restriction>
</xsd:simpleType>

 </xsd:schema>
</types>
<message name="getSearchResultSoapIn">
  <part name="arg" type="types:arg"/>
</message>
<message name="getSearchResultSoapOut">
  <part name="searchResult" type="types:out"/>
</message>

<portType name="QueryServiceSoap">
  <operation name="getSearchResult">
    <input message="tns:getSearchResultSoapIn"/>
    <output message="tns:getSearchResultSoapOut"/>
  </operation>
</portType>
<binding name="QueryServiceSoap" type="tns:QueryServiceSoap">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
  <operation name="getSearchResult">
    <soap:operation soapAction="http://www.iphrase.com/2003/11/oneStep/getSearchResult" style="rpc" />
    <input>
      <soap:body use="encoded" namespace="http://www.iphrase.com/2003/11/oneStep/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    </input>
    <output>
      <soap:body use="encoded" namespace="http://www.iphrase.com/2003/11/oneStep/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    </output>
  </operation>
</binding>


<service name="QueryService">
  <port name="QueryServiceSoap" binding="tns:QueryServiceSoap">
      <soap:address location="http://9.148.51.231:8777/service" />
  </port>
</service>
</definitions>

何らかの理由でaxis2のように、プリミティブ型のxsi:typeが省略されています。また、xmlns:xsd ="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www。 w3.org/2001/XMLSchema-インスタンスの名前空間もおそらく関連しています。Axis2クライアントを使用する場合、サーバーもアップグレードする必要はないと思います。

誰かが指示を与えることができますか、構成の問題のようですが、axis2に関する私の知識は非常に制限されています。ウェブ上で関連性のあるものを見つけようとする試みはすべて成功しませんでした。

どうもありがとう

4

1 に答える 1

1

WSDLで、bindingセクションが指定する場所style="document"use="encoded"?を参照してください。このWSDLは、ドキュメント/エンコードされたスタイルを指定していますが、これは非標準で非常に珍しいものです。このページでは、4つのスタイル(RPCとドキュメント、エンコードされたVSリテラル)について説明します。作成者がドキュメント/エンコードにスペースを費やしていないことがわかります。

Axis2はrpc/encodeをサポートしていません。私の推測では、document/encodedをサポートするために必要なビットも含まれていません。最善の策は、ドキュメント/リテラル​​をサポートする新しいインターフェイスをこのサーバーに追加することです。そうしないと、クライアントにAxisを使用してスタックする可能性があります。これは、JAX-WSクライアントからのrpc/encodedサービスの呼び出しについて説明しているページです。あなたはそれをあなたのニーズに適応させることができるかもしれません。

于 2012-11-02T07:27:55.987 に答える