Comment passer des “Null” (un vrai nom!) pour un web service SOAP en ActionScript 3?
Nous avons un employé dont le nom est Nul. Notre employé de recherche de l'application est tué lorsque ce dernier nom est utilisé comme terme de recherche (ce qui arrive assez souvent en ce moment). L'erreur reçus (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
.
Je suis en utilisant:
- WSDL (SAVON)
- Flex 3.5
- ActionScript 3
- ColdFusion 8
Remarque que l'erreur ne pas se produire lors de l'appel au webservice comme un objet à partir d'une page ColdFusion.
- Il ne peut pas vous aider à ce que beaucoup au problème spécifique, mais de SOAP 1.2 permet nullable valeurs, voir w3.org/TR/2001/WD-soap12-20010709/#_Toc478383513
- J'ai le sentiment que ça implique Dave Null.
- Au moins, il n'implique pas de Chuck Norris. Voici pourquoi rester loin de lui dans le code: codesqueeze.com/...
- L'employé a envisagé de changer de nom?
- Référencé sur BBC: bbc.com/future/story/...
- Il devrait vraiment envisager l'achat d'un Pointeur chien et de faire appel à lui NullPointer.
Vous devez vous connecter pour publier un commentaire.
De suivi vers le bas
Au début, je pensais que c'était une contrainte d'un bug où les
null
a été prise en contraints à"null"
et un test de"null" == null
était de passage. Il n'est pas. J'étais proche, mais de façon très, très mal. Désolé!Depuis, j'ai fait beaucoup de tripoter sur wonderfl.net et la traçabilité par le code de la
mx.rpc.xml.*
. À la ligne 1795 deXMLEncoder
(3,5 source), danssetValue
, tous les XMLEncoding se résume àqui est essentiellement le même:
Ce code, selon mon violon, renvoie un vide de l'élément XML. Mais pourquoi?
Cause
Selon l'intervenant Justin Mclean sur le rapport de bug FLEX-33664, le suivant est le coupable (voir les deux derniers essais dans mon violon qui le vérifier):
Quand
currentChild.appendChild
est passé la chaîne"null"
, il le convertit en un élément XML racine avec le textenull
, puis les tests de cet élément contre le littéral null. C'est une faiblesse de test d'égalité, de sorte que le XML contenant la valeur null est forcée à la valeur null type, ou le type null est contrainte à une racine de l'élément xml contenant la chaîne de caractère "null", et le test réussit là où il ne devrait pas échouer. Une des solutions pourrait être de toujours utiliser la stricte égalité tests lors de la vérification de XML (ou quoi que ce soit, vraiment) pour "nullness."Solution
La seule solution que je pense, court de corriger ce bug dans chaque putain de version d'ActionScript, est de tester les champs pour les "nuls" et d'échappement CDATA valeurs.
CDATA valeurs sont le moyen le plus approprié pour muter un texte entier de la valeur qui serait autrement cause de l'encodage/décodage des problèmes. Codage hexadécimal, par exemple, est destiné à des caractères individuels. CDATA valeurs sont privilégiées lorsque vous tentez de fuir l'intégralité du texte d'un élément. La plus grande raison pour cela est qu'il maintient une meilleure lisibilité.
Sur le xkcd note, le Bobby Tables de site web a de bons conseils pour éviter une mauvaise interprétation des données de l'utilisateur (dans ce cas, la chaîne de la valeur "Null") dans les requêtes SQL en plusieurs langues, y compris ColdFusion.
Il n'est pas clair d'après la question, c'est la source du problème, et compte tenu de la solution a fait remarquer dans un commentaire à la première réponse (intégrant les paramètres dans une structure), il semble probable que c'était autre chose.
Le problème pourrait être dans Flex SAVON, de l'encodeur. Essayez étendre le SAVON encoder dans votre application Flex et déboguer le programme pour voir comment la valeur null est manipulé. Ma conjecture est, c'est passé comme NaN (Pas un Nombre). Cela embrouillerait message SOAP unmarshalling processus parfois (notamment dans JBoss 5 serveur...). Je me souviens de l'extension de la SAVON de codeur et de l'exécution d'une vérification explicite sur la façon de NaN est manipulé.
(Sur une note de côté, êtes-vous prévu de faire quelque chose d'utile si l'employé id est Null, ce n'est pas un problème de validation? Je peux me tromper, car je ne connais que très peu l'exigence...)
@doc_180 eu la bonne idée, sauf qu'il est concentré sur les chiffres, alors que l'affiche originale a eu des problèmes avec des chaînes.
La solution est de changer le
mx.rpc.xml.XMLEncoder
fichier. C'est la ligne 121[J'ai regardé Flex 4.5.1 SDK; les numéros de ligne peuvent être différents dans d'autres versions]
Fondamentalement, la validation échoue parce que "le contenu est null', et donc votre argument n'est pas ajouté à la sortant Paquet SOAP; ainsi à l'origine du paramètre manquant erreur.
Vous avez à les étendre cette classe de supprimer la validation. Ensuite, il y a une grosse boule de neige jusqu'à la chaîne, modification de SOAPEncoder pour utiliser votre modifiée XMLEncoder, et puis de modifier le Fonctionnement d'utiliser votre modifiée SOAPEncoder, puis moidfying WebService pour utiliser votre autre Fonctionnement de la classe.
J'ai passé quelques heures sur, mais qui ont besoin de se déplacer sur. Il va probablement prendre un jour ou deux.
Vous pouvez être en mesure de résoudre le problème de la XMLEncoder ligne et faire un peu de monkey patching utiliser votre propre classe.
Je vais aussi ajouter que si vous passez à l'aide de RemoteObject/AMF avec ColdFusion, la valeur null est passé sans problèmes.
11/16/2013 mise à jour:
Je n'ai plus récent ajout à mon dernier commentaire à propos de RemoteObject/AMF. Si vous utilisez CF10; puis propriétés, avec une valeur null sur un objet sont supprimés du serveur côté de l'objet. Donc, vous avez pour vérifier les propriétés de l'existence avant d'y accéder, ou vous obtiendrez une erreur d'exécution. Case comme ceci:
C'est un changement dans le comportement de CF9; où l'null propriétés serait à son tour dans les cordes à vide.
Modifier 12/6/2013
Car il y avait une question sur la façon dont les valeurs null sont traitées voici un rapide exemple d'application pour démontrer comment une chaîne "null" portera sur le mot réservé null.
La trace de sortie est:
content
est la chaîne"null"
, et "null" == null renvoie faux, 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 comment XML.appendChild gère un argument de type chaîne, et comment une racine de l'élément XML contenant uniquement de la chaîne de la valeur "null" peut être contraint à un littéralnull
.true
est le comportement désiré ici. Si le contraire qui s'est passé, ce serait jeter de la chaîne de la valeur "null" dans le processus d'encodage, qui serait en fait la cause du problème. Toutefois, en raison de ce test réussit, le codeur continue, jusqu'à ce que XML.appendChild, il se défait en raison d'une contrainte de bug.var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s);
à l'exemple de code.Traduire tous les personnages dans leur hex-entité équivalents. Dans ce cas,
Null
serait converti enE;KC;C;
Stringifying un
null
valeur dans ActionScript donnera la chaîne"NULL"
. Je soupçonne que quelqu'un a décidé qu'il est, par conséquent, une bonne idée pour décoder la chaîne"NULL"
commenull
, provoquant la rupture que vous voyez ici, probablement parce qu'ils étaient de passage dansnull
objets et obtenir des chaînes dans la base de données, lorsqu'ils ne voulaient pas que (assurez-vous de vérifier ce genre de bug, trop).Comme un hack, vous pourriez envisager d'avoir un traitement spécial sur le côté client, la conversion de 'Null', corde à quelque chose qui ne peut se produire, par exemple, XXNULLXX et la conversion de revenir sur le serveur.
Elle n'est pas jolie, mais elle peut résoudre le problème pour une telle frontière de cas.
Null
?Eh bien, je suppose que Flex " de la mise en œuvre de la SAVON de Codeur semble sérialiser les valeurs null de manière incorrecte. La sérialisation comme une Chaîne Null ne semble pas être une bonne solution. L'formellement correctes version semble être de passer d'une valeur null comme:
De sorte que la valeur "Null" ne serait rien d'autre qu'une chaîne valide, ce qui est exactement ce que vous cherchez.
Je suppose que ce problème de Apache Flex ne devrait pas être difficile à faire. Je recommande l'ouverture d'un Jira question ou de contacter le gars de apache flex liste de diffusion. Cependant, ce serait uniquement à fixer le côté client. Je ne peux pas dire si ColdFusion sera en mesure de travailler avec des valeurs null codé de cette façon.
Voir aussi Radu Cotescu blog de Comment envoyer des valeurs null dans soapUI demandes.
null
valeur correctement, par la mise enxsi:nil="true"
sur l'élément. Le problème semble être dans la façon dont le code ActionScriptXML
type lui-même (pas le codeur) poignées de la chaîne"null"
.C'est une bidouille, mais à supposer qu'il y est un minimum de longueur pour
SEARCHSTRING
, par exemple, 2 personnages,substring
laSEARCHSTRING
paramètre lors de la deuxième personnage et de le passer comme deux paramètres à la place:SEARCHSTRING1 ("Nu")
etSEARCHSTRING2 ("ll").
Concatenate
ensemble lors de l'exécution de la requête à la base de données.n
,u
,l
spéciales de la sémantique dans le XML. "NULL" et "<![CDATA[NULL]]>" sont identiques à un analyseur XML.NULL
, mais pour être pédant,<blah>null</blah>
et<blah><![CDATA[null]]>
ne sont pas les mêmes d'un analyseur XML. Ils doit produire les mêmes résultats, cependant la logique de flux pour la manipulation est différente. C'est cet effet que nous sommes exploiter comme une solution de contournement du bug dans le flex XML de mise en œuvre. Je préconise pour ce rapport à d'autres approches, car elle préserve la lisibilité du texte, et n'a pas d'effets secondaires pour d'autres analyseurs.