web-dev-qa-db-ja.com

"Null"(本当の姓)をに渡る方法 SOAP ActionScript 3のWebサービス

姓が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
  • ActionScript 3
  • ColdFusion 8

ColdFusionページからWebサービスをオブジェクトとして呼び出すと、エラーしないが発生します。

4557
bill

xkcd noteBobby Tables Webサイト には、 ColdFusionなどのさまざまな言語のSQLクエリでユーザーデータ(この場合は文字列 "Null")の不適切な解釈を避けるための良いアドバイスがあります。

これが問題の原因であること、そして最初の答えに対するコメントで述べられている解決策(構造体にパラメータを埋め込むこと)を考えると、それは他の何かである可能性が高いようです。

293
Alex Dupuy

問題はFlexのSOAPエンコーダにあります。 FlexアプリケーションでSOAPエンコーダーを拡張し、プログラムをデバッグしてnull値の処理方法を確認してください。私の推測では、それは NaN (数字ではない)として渡されます。これはSOAPメッセージの非整列化プロセスをいつかめちゃくちゃにします(特に JBoss 5 server ...)。 SOAPエンコーダを拡張し、NaNの処理方法を明示的にチェックしたことを覚えています。

(補足として、従業員IDがNullの場合、何か役に立つことを期待されていますか?これは検証の問題ではないですか?要件をほとんど知らないので、私は間違っているかもしれません...)

236

元のポスターは文字列に関する問題を抱えていたが@ doc_180は彼が数字に焦点を当てていることを除いて、正しい概念を持っていた。

解決策はmx.rpc.xml.XMLEncoderファイルを変更することです。これは121行目です

    if (content != null)
        result += content;

[私はFlex 4.5.1 SDKを見ました。行番号は他のバージョンでは異なる場合があります。]

基本的に、 'contentがnull'であり、したがってあなたの引数が発信SOAP Packetに追加されていないため、検証は失敗します。そのため、パラメータ不足エラーが発生します。

検証を削除するには、このクラスを拡張する必要があります。それから、変更されたXMLEncoderを使用するようにSOAPEncoderを変更し、次に変更したSOAPEncoderを使用するようにOperationを変更し、次に代替のOperationクラスを使用するようにWebServiceをモイド化します。

私はそれに数時間を費やしましたが、進む必要があります。それはおそらく一日か二日かかるでしょう。

あなただけのXMLEncoderの行を修正して、あなた自身のクラスを使うためにいくつかのモンキーパッチをすることができるかもしれません。

また、ColdFusionでRemoteObject/AMFを使用するように切り替えた場合も、nullは問題なく渡されます。


11/16/2013更新

RemoteObject/AMFについての私の最後のコメントに、もう1つ最近追加されたものがあります。 CF10を使用している場合オブジェクトのnull値を持つプロパティは、サーバーサイドオブジェクトから削除されます。そのため、アクセスする前にプロパティの存在を確認する必要があります。そうしないと、ランタイムエラーが発生します。このようにチェックしてください:

<cfif (structKeyExists(arguments.myObject,'propertyName')>
 <!--- no property code --->
<cfelse>
 <!--- handle property  normally --->
</cfif>

これはCF9からの動作の変更です。 nullプロパティが空の文字列に変わる場所。


編集12/6/2013

Nullがどのように扱われるかについての質問がありましたので、ここでは文字列 "null"が予約語nullにどのように関連するかを示すための簡単なサンプルアプリケーションです。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.Adobe.com/mxml/2009" 
               xmlns:s="library://ns.Adobe.com/flex/spark" 
               xmlns:mx="library://ns.Adobe.com/flex/mx" minWidth="955" minHeight="600" initialize="application1_initializeHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function application1_initializeHandler(event:FlexEvent):void
            {
                var s :String = "null";
                if(s != null){
                    trace('null string is not equal to null reserved Word using the != condition');
                } else {
                    trace('null string is equal to null reserved Word using the != condition');
                }

                if(s == null){
                    trace('null string is equal to null reserved Word using the == condition');
                } else {
                    trace('null string is not equal to null reserved Word using the == condition');
                }

                if(s === null){
                    trace('null string is equal to null reserved Word using the === condition');
                } else {
                    trace('null string is not equal to null reserved Word using the === condition');
                }

            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
</s:Application>

トレース出力は次のとおりです。

null文字列は、!=条件を使用したnull予約語と等しくありません

==条件を使用したnull文字列がnullの予約語と等しくない

===条件を使用したnull文字列がnullの予約語と等しくない

126
JeffryHouser

すべての文字をそれに相当する16進実体に変換します。この場合、Null&#4E;&#75;&#6C;&#6C;に変換されます。

63
doogle

ActionScriptnull値を文字列化すると、文字列"NULL"が生成されます。私の疑いは、誰かが"NULL"nullとしてデコードすることをお勧めするということです - おそらくあなたがnullオブジェクトを渡して、データベース内の文字列は、それを望んでいないときに使用してください(そのような種類のバグも必ずチェックしてください)。

50
Andrew Aylett

ハックとして、クライアント側で特別な処理を行い、 'Null'文字列を決して起こらないようなもの、例えばXXNULLXXに変換し、サーバーに戻すことを検討することができます。

それはきれいではありませんが、それはそのような境界の場合の問題を解決するかもしれません。

37
Mark

FlexのSOAPエンコーダの実装は、null値を誤ってシリアル化しているようです。それらをString Nullとしてシリアライズするのは良い解決策ではないようです。形式的に正しいバージョンは、null値を次のように渡します。

<childtag2 xsi:nil="true" />

そのため、 "Null"の値は有効な文字列に他ならないでしょう。それはまさにあなたが探しているものです。

Apache Flexでこれを修正するのはそれほど難しいことではないと思います。私はJiraの問題を開くか、Apache-flexメーリングリストの連中に連絡することをお勧めします。しかし、これはクライアント側を修正するだけです。 ColdFusionがこの方法でエンコードされたnull値を処理できるかどうかはわかりません。

Radu Cotescuのブログ投稿も参照してください。soapUIリクエストでnull値を送信する方法

30
Christofer Dutz

ちょっとしたことですが、SEARCHSTRINGの最小長が2文字であると仮定すると、substringは2番目の文字のSEARCHSTRINGパラメーターであり、代わりに2つのパラメーターとして渡します:SEARCHSTRING1 ("Nu")およびSEARCHSTRING2 ("ll").Concatenateは、データベースへのクエリを実行するときに一緒に戻ります。

21
SPitBalls.com