1. ホーム
  2. apache-flex

[解決済み] ActionScript 3 で SOAP ウェブサービスに "Null" (本当の苗字!) を渡す方法

2022-03-14 19:50:30

質問

苗字がNullの社員がいます。その姓が検索語として使用された場合(現在ではかなりの頻度で使用されています)、当社の従業員検索アプリケーションは強制終了します。受け取ったエラー(Fiddlerに感謝!)は次のとおりです。

<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 ( SOAP )
  • フレックス3.5
  • アクションスクリプト3
  • コールドフュージョン8

エラーに注意してください ではありません。 は、ColdFusion ページからオブジェクトとしてウェブサービスを呼び出すと発生します。

解決方法は?

追跡調査

最初、私はこのバグが null が強制的に "null" のテストと "null" == null が通っていた。違うんです。 惜しかったけど、とてもとても残念です。申し訳ありません。

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

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

というもので、本質的には同じです。

currentChild.appendChild("null");

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

原因

バグレポートのコメント投稿者 Justin Mclean 氏によると FLEX-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を含むXMLがNULL型に強制されるか、NULL型が文字列"NULL"を含むルートXML要素に強制されて、テストは間違いなく失敗すべきところでパスされます。ひとつの修正として、常に 厳密な平等 XML (あるいは本当にどんなものでも) をチェックするときに "nullness." をテストすることができます。

解決方法

このバグをすべてのActionScriptのバージョンで修正することを除けば、私が思いつく唯一の合理的な回避策は、フィールドが"null"かどうかをテストすることである。 としてエスケープします。 CDATA値 .

CDATA値は、エンコーディング/デコーディングの問題を引き起こすテキスト値全体を変異させる最も適切な方法です。 例えば、Hexエンコーディングは、個々の文字に対応するものです。CDATA値は、要素のテキスト全体をエスケープする場合に好まれます。その最大の理由は、人間の可読性を維持するためです。