Nous avons un employé dont le nom de famille est Null. Notre application de recherche d'employés est supprimée lorsque ce nom de famille est utilisé comme terme de recherche (ce qui est assez fréquent maintenant). L'erreur reçue (merci Fiddler!) Est:
<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>
Mignon, hein?
Le type de paramètre est string
.
J'utilise:
Notez que l'erreur ne se produit pas lors de l'appel du webservice en tant qu'objet à partir d'une page ColdFusion.
apache-flex
actionscript
soap
coldfusion
wsdl
facture
la source
la source
Réponses:
Le retrouver
Au début, je pensais que c'était un bug de coercition dans lequel on
null
était contraint"null"
et un test de"null" == null
réussite. Ce n'est pas. J'étais proche, mais tellement, très mal. Désolé pour ça!J'ai depuis fait beaucoup de tripotage sur wonderfl.net et de traçage à travers le code dans
mx.rpc.xml.*
. À la ligne 1795 deXMLEncoder
(dans la source 3.5), danssetValue
, tous les XMLEncoding se résument àqui est essentiellement le même que:
Ce code, selon mon violon d'origine, renvoie un élément XML vide. Mais pourquoi?
Cause
Selon le commentateur Justin Mclean sur le rapport de bug FLEX-33664 , le coupable est le suivant (voir les deux derniers tests dans mon violon qui le vérifient):
Lorsque
currentChild.appendChild
la chaîne est passée"null"
, elle la convertit d'abord en un élément XML racine avec du textenull
, puis teste cet élément par rapport au littéral nul. Il s'agit d'un test d'égalité faible, donc soit le XML contenant null est contraint au type null, soit le type null est contraint à un élément racine xml contenant la chaîne "null", et le test réussit là où il devrait sans doute échouer. Un correctif pourrait être de toujours utiliser des tests d' égalité stricts lors de la vérification de la nullité de XML (ou n'importe quoi, vraiment).Solution
La seule solution raisonnable à laquelle je peux penser, à moins de corriger ce bogue dans chaque fichue version d'ActionScript, est de tester les champs pour "null" et de les échapper en tant que valeurs CDATA .Les valeurs CDATA sont le moyen le plus approprié de muter une valeur de texte entière qui, autrement, provoquerait des problèmes d'encodage / décodage. Le codage hexadécimal, par exemple, est destiné à des caractères individuels. Les valeurs CDATA sont préférées lorsque vous échappez au texte entier d'un élément. La principale raison en est qu'il maintient la lisibilité humaine.
la source
Sur la note xkcd , le site Web de Bobby Tables a de bons conseils pour éviter l'interprétation incorrecte des données utilisateur (dans ce cas, la chaîne "Null") dans les requêtes SQL dans diverses langues, y compris ColdFusion .
Il ne ressort pas clairement de la question que c'est la source du problème, et compte tenu de la solution notée dans un commentaire à la première réponse (intégration des paramètres dans une structure), il semble probable qu'il s'agissait d'autre chose.
la source
Le problème pourrait être dans l'encodeur SOAP de Flex. Essayez d'étendre l'encodeur SOAP dans votre application Flex et déboguez le programme pour voir comment la valeur nulle est gérée.
Je suppose que c'est passé comme NaN (pas un nombre). Cela gâchera le processus de démasquage des messages SOAP à un moment donné (notamment sur le serveur JBoss 5 ...). Je me souviens avoir étendu l'encodeur SOAP et effectué une vérification explicite sur la façon dont NaN est géré.
la source
@ doc_180 avait le bon concept, sauf qu'il se concentre sur les nombres, alors que l'affiche originale avait des problèmes avec les chaînes.
La solution est de changer le
mx.rpc.xml.XMLEncoder
fichier. Il s'agit de la ligne 121:(J'ai regardé Flex 4.5.1 SDK; les numéros de ligne peuvent différer dans d'autres versions.)
Fondamentalement, la validation échoue car «le contenu est nul» et votre argument n'est donc pas ajouté au paquet SOAP sortant; provoquant ainsi l'erreur de paramètre manquante.
Vous devez étendre cette classe pour supprimer la validation. Ensuite, il y a une grosse boule de neige dans la chaîne, modifiant SOAPEncoder pour utiliser votre XMLEncoder modifié, puis modifiant Operation pour utiliser votre SOAPEncoder modifié, puis moidfying WebService pour utiliser votre autre classe Operation.
J'y ai passé quelques heures, mais je dois continuer. Cela prendra probablement un jour ou deux.
Vous pourrez peut-être simplement corriger la ligne XMLEncoder et faire quelques patches de singe pour utiliser votre propre classe.
J'ajouterai également que si vous passez à l'utilisation de RemoteObject / AMF avec ColdFusion, la valeur null est transmise sans problème.
Mise à jour du 16/11/2013 :
J'ai un ajout récent à mon dernier commentaire sur RemoteObject / AMF. Si vous utilisez ColdFusion 10; puis les propriétés avec une valeur nulle sur un objet sont supprimées de l'objet côté serveur. Donc, vous devez vérifier l'existence des propriétés avant d'y accéder ou vous obtiendrez une erreur d'exécution.
Vérifiez comme ceci:
Il s'agit d'un changement de comportement par rapport à ColdFusion 9; où les propriétés nulles se transformeraient en chaînes vides.
Modifier le 06/12/2013
Puisqu'il y avait une question sur la façon dont les null sont traités, voici un exemple rapide d'application pour montrer comment une chaîne "null" se rapportera au mot réservé null.
La sortie de trace est:
la source
content
trouve la chaîne"null"
, et "null" == null renvoie false, de sorte que le test se comporte comme prévu. Au lieu de cela, je crois que le problème est un mélange de la façon dont XML.appendChild gère un argument de chaîne et comment un élément XML racine contenant uniquement la chaîne "null" peut être contraint à un littéralnull
.true
est le comportement souhaité ici. Si le contraire se produisait, cela éliminerait la chaîne "null" du processus de codage, ce qui serait en fait la cause du problème. Cependant, parce que ce test réussit, l'encodeur continue, jusqu'à ce que XML.appendChild le supprime en raison d'un bogue de coercition.var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s);
à votre exemple de code.Traduisez tous les personnages dans leurs équivalents hexadécimaux. Dans ce cas,
Null
serait converti enE;KC;C;
la source
La chaîne d'une
null
valeur dans ActionScript donnera la chaîne"NULL"
. Je soupçonne que quelqu'un a décidé que c'est donc une bonne idée de décoder la chaîne"NULL"
carnull
, provoquant la rupture que vous voyez ici - probablement parce qu'ils passaient desnull
objets et obtenaient des chaînes dans la base de données, alors qu'ils ne voulaient pas cela (alors assurez-vous de vérifier ce genre de bogue aussi).la source
En tant que hack, vous pouvez envisager d'avoir une gestion spéciale du côté client, en convertissant la chaîne 'Null' en quelque chose qui ne se produira jamais, par exemple, XXNULLXX et en reconvertissant sur le serveur.
Ce n'est pas joli, mais cela peut résoudre le problème pour un tel cas limite.
la source
Null
?Eh bien, je suppose que l'implémentation Flex de l'encodeur SOAP semble sérialiser les valeurs nulles de manière incorrecte. Les sérialiser en tant que String Null ne semble pas être une bonne solution. La version formellement correcte semble passer une valeur nulle comme:
Ainsi, la valeur de "Null" ne serait rien d'autre qu'une chaîne valide, ce qui est exactement ce que vous recherchez.
Je suppose que la correction de cela dans Apache Flex ne devrait pas être si difficile à faire. Je recommanderais d'ouvrir un numéro Jira ou de contacter les gars de la liste de diffusion apache-flex. Cependant, cela ne résoudrait que le côté client. Je ne peux pas dire si ColdFusion pourra travailler avec des valeurs nulles encodées de cette façon.
Voir aussi le blog de Radu Cotescu Comment envoyer des valeurs nulles dans les requêtes soapUI .
la source
null
valeur correctement, en définissantxsi:nil="true"
l'élément. Le problème semble être lié à la manière dont leXML
type ActionScript lui-même (et non l'encodeur) gère la chaîne"null"
.C'est un kludge, mais en supposant qu'il y ait une longueur minimale pour
SEARCHSTRING
, par exemple 2 caractères,substring
leSEARCHSTRING
paramètre au deuxième caractère et passez-le à la place comme deux paramètres:SEARCHSTRING1 ("Nu")
etSEARCHSTRING2 ("ll").
Concatenate
les remettre ensemble lors de l'exécution de la requête dans la base de données.la source
n
,u
,l
ont une sémantique spéciale en XML. "NULL" et "<! [CDATA [NULL]]>" sont identiques à un analyseur XML.NULL
, mais être pédant,<blah>null</blah>
et<blah><![CDATA[null]]>
ne sont pas les mêmes que pour un analyseur XML. Ils devraient produire les mêmes résultats, mais le flux logique pour les gérer est différent. C'est cet effet que nous exploitons comme solution de contournement au bogue dans l'implémentation XML flexible. Je préconise cela par rapport à d'autres approches car il préserve la lisibilité du texte et n'a aucun effet secondaire pour les autres analyseurs.