ActionScript 3 で「Null」(実名)を SOAP Web サービスに渡す方法 質問する

ActionScript 3 で「Null」(実名)を SOAP Web サービスに渡す方法 質問する

姓が Null である従業員がいます。その姓が検索語として使用されると (現在ではよくあることですが)、従業員検索アプリケーションが強制終了されます。表示されるエラーは次のとおりです。

<soapenv:Fault>
   <faultcode>soapenv:Server.userException</faultcode>
   <faultstring>coldfusion.xml.rpc.CFCInvocationException: [coldfusion.runtime.MissingArgumentException : The SEARCHSTRING parameter to the getFacultyNames function is required but was not passed in.]</faultstring>

パラメータタイプは ですstring

使っています:

  • WSDL石鹸
  • フレックス3.5
  • アクションスクリプト3
  • コールドフュージョン8

ColdFusion ページからオブジェクトとして Web サービスを呼び出す場合、エラーは発生しないことに注意してください。

ベストアンサー1

追跡する

最初、これはnullが強制され"null"、 のテストが"null" == null合格するという強制バグだと思いました。違います。近かったのですが、まったくの間違いでした。申し訳ありません!

私はそれ以来、たくさんのwonderfl.net でいじくり回すのコード全体をトレースしますmx.rpc.xml.*。 の 1795 行目XMLEncoder(3.5 ソース) では、setValueXMLEncoding はすべて次のように要約されます。

currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));

これは基本的に以下と同じです:

currentChild.appendChild("null");

私のオリジナルのフィドルによれば、このコードは空の XML 要素を返します。しかし、なぜでしょうか?

原因

バグレポートのコメント投稿者ジャスティン・マクリーン氏によるとフレックス33664、次のものが犯人です(私の最後の2つのテストを参照してくださいフィドルこれを検証する:

var thisIsNotNull:XML = <root>null</root>;
if(thisIsNotNull == null){
    // always branches here, as (thisIsNotNull == null) strangely returns true
    // despite the fact that thisIsNotNull is a valid instance of type XML
}

currentChild.appendChildに文字列が渡される"null"、まずそれをテキストを含むルート XML 要素に変換しnull、次にその要素を null リテラルに対してテストします。これは弱い等価テストなので、null を含む XML が null 型に強制変換されるか、null 型が文字列 "null" を含むルート XML 要素に強制変換され、テストは失敗するはずのところで成功します。1 つの修正方法としては、常に を使用することです。厳密な平等XML (または実際には何でも) の「null 性」をチェックするときにテストします。

解決

私が考えられる唯一の合理的な回避策は、ActionScriptのすべてのバージョンでこのバグを修正する以外に、フィールドを「null」としてテストし、 次のようにエスケープすることです。CDATA値

CDATA 値は、エンコード/デコードの問題を引き起こす可能性のあるテキスト値全体を変更する最も適切な方法です。たとえば、16 進エンコードは個々の文字を対象としています。要素のテキスト全体をエスケープする場合は、CDATA 値が推奨されます。その最大の理由は、人間の可読性を維持することです。

おすすめ記事