1

私はSOAPサービスと対話する必要があり、そうするのに多くの問題を抱えています。これに関するポインタを本当にいただければ幸いです。元のエラーメッセージは次のとおりです。

org.apache.axis2.databinding.ADBException: Any type element type has not been given

いくつかの調査の結果、これはSUDSとサーバーの間の不一致であり、サーバーはどのように対処する必要があるかがわかりました。

type="xsd:anyType"

問題の要素について。

私はSOAPUIを使用して確認し、アドバイスの後、次の手順を実行することで問題を修正できることを確認しました。

  1. 問題の原因となる各要素にxsi:type = "xsd:string"を追加する
  2. xmlns:xsd="http://www.w3.org/2001/XMLSchema"をSOAPエンベロープに追加する

したがって、SUDSが現在これを行っている場所:

<SOAP-ENV:Envelope ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns3:Body>
  <ns0:method>
     <parameter>
        <values>
           <table>
              <key>EMAIL_ADDRESS</key>
              <value>example@example.org</value>
           </table>
        </values>
     </parameter>
  </ns0:method>

代わりにこれを生成する必要があります:

<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

  <ns3:Body>
  <ns0:method>
     ...
     <parameter>
        <values>
           <table>
              <key xsi:type="xsd:string">EMAIL_ADDRESS</key>
              <value xsi:type="xsd:string">example@example.org</value>
           </table>
        </values>
     </parameter>
  </ns0:method>

これを行う正しい方法はありますか?ImportDoctorまたはMessagePluginsを使用する提案を見てきましたが、目的の効果を実現する方法を実際に理解していません。

4

2 に答える 2

10

私が見つけた解決策は、MessagePlugin を使用して、送信直前に本質的に手動で XML を修正することでした。もっとエレガントなものがあればいいのにと思いましたが、少なくともこれはうまくいきます:

class SoapFixer(MessagePlugin):

    def marshalled(self, context):
        # Alter the envelope so that the xsd namespace is allowed
        context.envelope.nsprefixes['xsd'] = 'http://www.w3.org/2001/XMLSchema'
        # Go through every node in the document and apply the fix function to patch up incompatible XML. 
        context.envelope.walk(self.fix_any_type_string)

    def fix_any_type_string(self, element):
        """Used as a filter function with walk in order to fix errors.
        If the element has a certain name, give it a xsi:type=xsd:string. Note that the nsprefix xsd must also
         be added in to make this work."""
        # Fix elements which have these names
        fix_names = ['elementnametofix', 'anotherelementname']
        if element.name in fix_names:
            element.attributes.append(Attribute('xsi:type', 'xsd:string'))
于 2012-06-11T09:46:08.900 に答える
1

この特定のライブラリに関する多くのことと同様に、悲しくて陽気ですが、正確な答えは次のとおりです。

http://lists.fedoraproject.org/pipermail/suds/2011-September/001519.html

上記から:

soapenv = soapenv.encode('utf-8')
plugins.message.sending(envelope=soapenv)

になります:

soapenv = soapenv.encode('utf-8')
ctx = plugins.message.sending(envelope=soapenv)
soapenv = ctx.envelope

基本的に、これは実装のバグであり、プラグインを実行する行を編集して実際にプラグインの結果を返すことで自分でパッチを当てることができますが、これを修正する SUDS のパッチを適用して更新したバージョンはまだ知りません (tho詳しくは調べていません)。

于 2012-09-12T15:06:51.293 に答える