姓が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
です。
使ってます:
ColdFusionページからWebサービスをオブジェクトとして呼び出すと、エラーしないが発生します。
xkcd note 、 Bobby Tables Webサイト には、 ColdFusionなどのさまざまな言語のSQLクエリでユーザーデータ(この場合は文字列 "Null")の不適切な解釈を避けるための良いアドバイスがあります。 。
これが問題の原因であること、そして最初の答えに対するコメントで述べられている解決策(構造体にパラメータを埋め込むこと)を考えると、それは他の何かである可能性が高いようです。
問題はFlexのSOAPエンコーダにあります。 FlexアプリケーションでSOAPエンコーダーを拡張し、プログラムをデバッグしてnull値の処理方法を確認してください。私の推測では、それは NaN (数字ではない)として渡されます。これはSOAPメッセージの非整列化プロセスをいつかめちゃくちゃにします(特に JBoss 5 server ...)。 SOAPエンコーダを拡張し、NaNの処理方法を明示的にチェックしたことを覚えています。
(補足として、従業員IDがNullの場合、何か役に立つことを期待されていますか?これは検証の問題ではないですか?要件をほとんど知らないので、私は間違っているかもしれません...)
元のポスターは文字列に関する問題を抱えていたが@ 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の予約語と等しくない
すべての文字をそれに相当する16進実体に変換します。この場合、Null
はE;KC;C;
に変換されます。
ActionScript でnull
値を文字列化すると、文字列"NULL"
が生成されます。私の疑いは、誰かが"NULL"
をnull
としてデコードすることをお勧めするということです - おそらくあなたがnull
オブジェクトを渡して、データベース内の文字列は、それを望んでいないときに使用してください(そのような種類のバグも必ずチェックしてください)。
ハックとして、クライアント側で特別な処理を行い、 'Null'文字列を決して起こらないようなもの、例えばXXNULLXXに変換し、サーバーに戻すことを検討することができます。
それはきれいではありませんが、それはそのような境界の場合の問題を解決するかもしれません。
FlexのSOAPエンコーダの実装は、null値を誤ってシリアル化しているようです。それらをString Nullとしてシリアライズするのは良い解決策ではないようです。形式的に正しいバージョンは、null値を次のように渡します。
<childtag2 xsi:nil="true" />
そのため、 "Null"の値は有効な文字列に他ならないでしょう。それはまさにあなたが探しているものです。
Apache Flexでこれを修正するのはそれほど難しいことではないと思います。私はJiraの問題を開くか、Apache-flexメーリングリストの連中に連絡することをお勧めします。しかし、これはクライアント側を修正するだけです。 ColdFusionがこの方法でエンコードされたnull値を処理できるかどうかはわかりません。
Radu Cotescuのブログ投稿も参照してください。soapUIリクエストでnull値を送信する方法。
ちょっとしたことですが、SEARCHSTRING
の最小長が2文字であると仮定すると、substring
は2番目の文字のSEARCHSTRING
パラメーターであり、代わりに2つのパラメーターとして渡します:SEARCHSTRING1 ("Nu")
およびSEARCHSTRING2 ("ll").
Concatenate
は、データベースへのクエリを実行するときに一緒に戻ります。