2011-08-05 14 views
3

我々はで動作するようにSOAPエンドポイントを提供する複数のウェブサービスと通信しているperlでシステムに取り組んでいます。それらはサービスを記述するためのWSDLファイルを提供します(C#.Netでは "Add Service Reference"でこれらを使用します)。これらのファイルをperlモジュールにインポートするには、wsdl2perl.plを使用します。のPerl - SOAP :: WSDL - wsdl2perl.pl

すべてのサービスは、障害を返すときを除いて、取り組んでいます。

私たちは、このようなサービスを呼び出す:

my $service = OurInterfaces::OurService::OurPort->new(); 
my $result = $service->ourMethod({ someParameter => '1234' }); 
die $result->get_faultstring()->serialize() if not $result; 

我々はフォルト文字列にアクセスしようとすると、私たちのperlスクリプトはこれで死ぬ:

<Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>Error deserializing message: Cannot resolve class for Fault/detail/Errors/ErrorDetail via UPSRateTypemaps::RateService at /usr/lib/perl5/site_perl/5.8.8/SOAP/WSDL/Expat/MessageParser.pm line 147. 
at line 1 at /usr/lib/perl5/site_perl/5.8.8/SOAP/WSDL/Expat/Base.pm line 82 
. 
Message was: 
&lt;soapenv:Envelope xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;&lt;soapenv:Header/&gt;&lt;soapenv:Body&gt;&lt;soapenv:Fault&gt;&lt;faultcode&gt;Client&lt;/faultcode&gt;&lt;faultstring&gt;An exception has been raised as a result of client data.&lt;/faultstring&gt;&lt;detail&gt;&lt;err:Errors xmlns:err=&quot;http://www.ups.com/schema/xpci/1.0/error&quot;&gt;&lt;err:ErrorDetail&gt;&lt;err:Severity&gt;Hard&lt;/err:Severity&gt;&lt;err:PrimaryErrorCode&gt;&lt;err:Code&gt;10001&lt;/err:Code&gt;&lt;err:Description&gt;The XML document is not well formed&lt;/err:Description&gt;&lt;err:Digest&gt;&amp;lt;/RateRequest&gt; does not close tag &amp;lt;Request&gt;.&lt;/err:Digest&gt;&lt;/err:PrimaryErrorCode&gt;&lt;err:Location/&gt;&lt;/err:ErrorDetail&gt;&lt;/err:Errors&gt;&lt;/detail&gt;&lt;/soapenv:Fault&gt;&lt;/soapenv:Body&gt;&lt;/soapenv:Envelope&gt;</faultstring><faultactor>urn:localhost</faultactor></Fault> 

XMLが障害のために返されることが表示されますクラス(Class :: Std)に正しくマップされていません。どうすればこの問題を解決できますか?

また、エラーメッセージをマップするために必要なことを説明している記事はありますか?ほとんどの部分については、wsdl2perl.plは平凡なの魔法のです。

答えて

2

まだ回答がありません。私はそれを働かせるためにしたことを投稿します。

我々はour $typemap_1を持ってTypemap.pmファイルを開いて、このような行を追加しました:

'Fault/detail' => 'UPSTrackElements::Errors' 
'Fault/detail/Errors' => 'UPSTrackElements::Errors', 
'Fault/detail/Errors/ErrorDetail' => 'UPSTrackTypes::ErrorDetailType', 
... 

wsdl2perl.plは、私たちが必要なエラーのクラスをインポートしたが、それはタイプマップファイルにそれらを適切にフックアップしませんでした。一般に、すべてのErrorクラスをマップした場所の前に 'Fault/detail'を追加する必要がありました。私はなぜ明らかにwsdl2perl.plがそれらを正しくマップすることができないのか分かりませんが、明らかにクラスを生成する問題はありませんでした。

の適切なXPathに、フォールトxmlのすべてのフィールドを記入する必要がありました。それは今私たちのために働いていますが、理解するのはむしろ醜いものでした。

関連する問題