ActionScript 3でSOAP Webサービスに"Null"(実在する名字)を渡す方法

苗字が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)
  • Flex 3.5
  • ActionScript 3
  • ColdFusion 8

なお、ColdFusionのページからオブジェクトとしてウェブサービスを呼び出した場合には、このエラーは発生しません。

xkcd note]1には、Bobby Tables websiteには、ColdFusionを含む様々な言語のSQLクエリにおいて、ユーザーデータ(この場合は文字列 "Null")の不適切な解釈を避けるための良いアドバイスがあります。

これが問題の原因であることは質問からは明らかではありませんし、最初の回答に対するコメントで指摘された解決策(構造体にパラメータを埋め込む)を考えると、他の原因である可能性が高いと思われます。

解説 (0)

問題はFlexのSOAPエンコーダにあるかもしれません。Flex アプリケーションで SOAP エンコーダーを拡張してみて、プログラムをデバッグし、NULL 値がどのように処理されるかを確認してください。

おそらく、NaN (Not a Number)として渡されているのではないかと思います。これは、いつかSOAPメッセージのアンマーシャル処理を混乱させるでしょう(最も顕著なのはJBoss 5サーバーで...)。SOAPエンコーダーを拡張して、NaNがどのように処理されるかを明示的にチェックしたことを覚えています。

解説 (1)

工夫としては、クライアント側で特別な処理を行い、「Null」文字列をXXNULLXXなどの絶対に発生しない文字列に変換し、サーバー側で変換しなおすことが考えられます。

きれいではありませんが、このようなバウンダリーケースの問題を解決できるかもしれません。

解説 (5)