Wir haben einen Mitarbeiter, dessen Nachname Null ist. Unsere Mitarbeiter-Suchanwendung wird beendet, wenn dieser Nachname als Suchbegriff verwendet wird (was derzeit häufig vorkommt). Der Fehler (danke Fiddler!) Ist:
<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>
Süß, oder?
Der Parametertyp ist string
.
Ich benutze:
Beachten Sie, dass der Fehler nicht auftritt, wenn der Webservice als Objekt von einer ColdFusion-Seite aufgerufen wird.
apache-flex
actionscript
soap
coldfusion
wsdl
Rechnung
quelle
quelle
Antworten:
Aufspüren
Zuerst dachte ich, dies sei ein Zwangsfehler, zu dem
null
man gezwungen wurde"null"
und an dem ein Test"null" == null
bestanden wurde. Es ist nicht. Ich war nah dran, aber so sehr, sehr falsch. Das tut mir leid!Ich habe seitdem viel auf Wonderfl.net herumgespielt und den Code in nachverfolgt
mx.rpc.xml.*
. In Zeile 1795 vonXMLEncoder
(in der 3.5-Quelle) insetValue
läuft die gesamte XMLEn-Codierung aufDas ist im Wesentlichen das gleiche wie:
Dieser Code gibt meiner ursprünglichen Geige zufolge ein leeres XML-Element zurück. Aber warum?
Ursache
Laut dem Kommentator Justin Mclean zum Fehlerbericht FLEX-33664 ist das Folgende der Schuldige (siehe die letzten beiden Tests in meiner Geige, die dies bestätigen):
Wenn
currentChild.appendChild
die Zeichenfolge übergeben wird"null"
, wird sie zuerst in ein XML-Stammelement mit Text konvertiertnull
und anschließend mit dem Nullliteral getestet. Dies ist ein schwacher Gleichheitstest. Daher wird entweder das XML mit Null zum Nulltyp oder der Nulltyp zu einem XML-Stammelement mit der Zeichenfolge "Null" gezwungen, und der Test besteht dort, wo er möglicherweise fehlschlagen sollte. Eine Lösung könnte darin bestehen, immer strenge Gleichheitstests zu verwenden, wenn XML (oder irgendetwas anderes) auf "Nullheit" überprüft wird.Lösung
Die einzige vernünftige Problemumgehung, die ich mir vorstellen kann, ohne diesen Fehler in jeder verdammten Version von ActionScript zu beheben, besteht darin, Felder auf "null" zu testen und sie als CDATA-Werte zu maskieren .CDATA-Werte sind die am besten geeignete Methode, um einen gesamten Textwert zu mutieren, der sonst zu Codierungs- / Decodierungsproblemen führen würde. Die Hex-Codierung ist beispielsweise für einzelne Zeichen gedacht. CDATA-Werte werden bevorzugt, wenn Sie den gesamten Text eines Elements maskieren. Der Hauptgrund dafür ist, dass die menschliche Lesbarkeit erhalten bleibt.
quelle
Auf der xkcd-Anmerkung finden Sie auf der Bobby Tables-Website gute Ratschläge, um die falsche Interpretation von Benutzerdaten (in diesem Fall die Zeichenfolge "Null") in SQL-Abfragen in verschiedenen Sprachen, einschließlich ColdFusion, zu vermeiden .
Aus der Frage geht nicht hervor, dass dies die Ursache des Problems ist, und angesichts der Lösung, die in einem Kommentar zur ersten Antwort (Einbetten der Parameter in eine Struktur) angegeben ist, scheint es wahrscheinlich, dass es sich um etwas anderes handelte.
quelle
Das Problem könnte im SOAP-Encoder von Flex liegen. Versuchen Sie, den SOAP-Encoder in Ihrer Flex-Anwendung zu erweitern, und debuggen Sie das Programm, um zu sehen, wie der Nullwert behandelt wird.
Ich vermute, es wird als NaN (Not a Number) übergeben. Dies wird den SOAP-Nachrichten-Unmarshalling-Prozess irgendwann durcheinander bringen (insbesondere auf dem JBoss 5-Server ...). Ich erinnere mich, dass ich den SOAP-Encoder erweitert und explizit überprüft habe, wie mit NaN umgegangen wird.
quelle
@ doc_180 hatte das richtige Konzept, außer dass er sich auf Zahlen konzentriert, während das Originalplakat Probleme mit Zeichenfolgen hatte.
Die Lösung besteht darin, die
mx.rpc.xml.XMLEncoder
Datei zu ändern . Dies ist Zeile 121:(Ich habe mir das Flex 4.5.1 SDK angesehen. Die Zeilennummern können in anderen Versionen abweichen.)
Grundsätzlich schlägt die Validierung fehl, da "Inhalt null" ist und Ihr Argument daher nicht zum ausgehenden SOAP-Paket hinzugefügt wird. Dadurch wird der fehlende Parameterfehler verursacht.
Sie müssen diese Klasse erweitern, um die Validierung zu entfernen. Dann gibt es einen großen Schneeball in der Kette, der SOAPEncoder ändert, um Ihren modifizierten XMLEncoder zu verwenden, und dann Operation ändert, um Ihren modifizierten SOAPEncoder zu verwenden, und dann WebService, um Ihre alternative Operationsklasse zu verwenden.
Ich habe ein paar Stunden damit verbracht, aber ich muss weitermachen. Es wird wahrscheinlich ein oder zwei Tage dauern.
Möglicherweise können Sie einfach die XMLEncoder-Zeile reparieren und Affen-Patches durchführen , um Ihre eigene Klasse zu verwenden.
Ich werde auch hinzufügen, dass, wenn Sie mit ColdFusion auf RemoteObject / AMF umsteigen, die Null ohne Probleme übergeben wird.
16.11.2013 Update :
Ich habe einen weiteren Neuzugang zu meinem letzten Kommentar zu RemoteObject / AMF. Wenn Sie ColdFusion 10 verwenden; Dann werden Eigenschaften mit einem Nullwert für ein Objekt aus dem serverseitigen Objekt entfernt. Sie müssen also vor dem Zugriff prüfen, ob Eigenschaften vorhanden sind, da sonst ein Laufzeitfehler angezeigt wird.
Überprüfen Sie wie folgt:
Dies ist eine Verhaltensänderung gegenüber ColdFusion 9. Dabei würden die Null-Eigenschaften zu leeren Zeichenfolgen.
Bearbeiten 06.12.2013
Da es eine Frage zur Behandlung von Nullen gab, finden Sie hier eine kurze Beispielanwendung, um zu demonstrieren, wie sich eine Zeichenfolge "null" auf das reservierte Wort null bezieht.
Die Trace-Ausgabe lautet:
quelle
content
befindet sich die Zeichenfolge"null"
, und "null" == null gibt false zurück, sodass sich der Test wie beabsichtigt verhält. Stattdessen glaube ich, dass das Problem darin besteht, wie XML.appendChild mit einem Zeichenfolgenargument umgeht und wie ein XML-Stammelement, das nur die Zeichenfolge "null" enthält, zu einem Literal gezwungen werden kannnull
.true
ist hier gewünschtes Verhalten. Wenn das Gegenteil passieren würde, würde dies die Zeichenfolge "null" aus dem Codierungsprozess verwerfen, was tatsächlich die Ursache des Problems wäre. Da dieser Test jedoch erfolgreich ist, läuft der Encoder weiter, bis XML.appendChild ihn aufgrund eines Zwangsfehlers verwirft.var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s);
es Ihrem Codebeispiel hinzu.Übersetzen Sie alle Zeichen in ihre Hex-Entitätsäquivalente. In diesem Fall
Null
würde in konvertiertE;KC;C;
quelle
Wenn Sie einen
null
Wert in ActionScript kennzeichnen , erhalten Sie die Zeichenfolge"NULL"
. Mein Verdacht ist, dass jemand entschieden hat, dass es daher eine gute Idee ist, die Zeichenfolge"NULL"
als zu dekodierennull
, was den hier angezeigten Bruch verursacht - wahrscheinlich, weil ernull
Objekte übergeben und Zeichenfolgen in die Datenbank aufgenommen hat, als er dies nicht wollte das (also stellen Sie sicher, dass Sie auch nach solchen Fehlern suchen).quelle
Als Hack könnten Sie eine spezielle Behandlung auf der Clientseite in Betracht ziehen, indem Sie die Nullzeichenfolge in etwas konvertieren, das niemals auftreten wird, z. B. XXNULLXX, und die Konvertierung wieder auf dem Server durchführen.
Es ist nicht schön, aber es kann das Problem für einen solchen Grenzfall lösen.
quelle
Null
?Nun, ich denke, dass die Flex-Implementierung des SOAP-Encoders Nullwerte falsch zu serialisieren scheint. Die Serialisierung als String Null scheint keine gute Lösung zu sein. Die formal korrekte Version scheint darin zu bestehen, einen Nullwert zu übergeben als:
Der Wert von "Null" wäre also nichts anderes als eine gültige Zeichenfolge, genau das, wonach Sie suchen.
Ich denke, dass es nicht so schwer sein sollte, dies in Apache Flex zu beheben. Ich würde empfehlen, ein Jira-Problem zu eröffnen oder sich an die Leute der Apache-Flex-Mailingliste zu wenden. Dies würde jedoch nur die Client-Seite reparieren. Ich kann nicht sagen, ob ColdFusion mit auf diese Weise codierten Nullwerten arbeiten kann.
Siehe auch Radu Cotescus Blog-Beitrag So senden Sie Nullwerte in soapUI-Anfragen .
quelle
null
Wert ordnungsgemäß, indemxsi:nil="true"
das Element festgelegt wird. Das Problem scheint tatsächlich darin zu liegen, wie der ActionScript-XML
Typ selbst (nicht der Encoder) mit der Zeichenfolge umgeht"null"
.Es ist ein Kludge, aber vorausgesetzt, es gibt eine Mindestlänge
SEARCHSTRING
für beispielsweise 2 Zeichen,substring
denSEARCHSTRING
Parameter am zweiten Zeichen, und übergeben Sie ihn stattdessen als zwei Parameter:SEARCHSTRING1 ("Nu")
undSEARCHSTRING2 ("ll").
Concatenate
sie wieder zusammen, wenn Sie die Abfrage an die Datenbank ausführen.quelle
n
,,u
hatl
eine spezielle Semantik in XML. "NULL" und "<! [CDATA [NULL]]>" sind identisch mit einem XML-Parser.NULL
, sondern pedantisch sein sollte<blah>null</blah>
und<blah><![CDATA[null]]>
nicht mit einem XML-Parser identisch ist. Sie sollten die gleichen Ergebnisse liefern, jedoch ist der logische Ablauf für ihre Behandlung unterschiedlich. Diesen Effekt nutzen wir als Problemumgehung für den Fehler in der Flex-XML-Implementierung. Ich befürworte dies gegenüber anderen Ansätzen, da es die Lesbarkeit des Textes bewahrt und keine Nebenwirkungen für andere Parser hat.