web-dev-qa-db-fra.com

Comment passer "Null" (un vrai nom de famille!) À un service Web SOAP dans ActionScript 3?

Nous avons un employé dont le nom de famille est Null. Notre application de recherche d'employé est supprimée lorsque ce nom de famille est utilisé comme terme de recherche (ce qui est souvent le cas 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:

  • WSDL (SOAP)
  • Flex 3.5
  • ActionScript 3
  • ColdFusion 8

Notez que l'erreur ne survient pas lors de l'appel du service Web en tant qu'objet à partir d'une page ColdFusion.

4579
bill

Sur le note xkcd , le site Web de Bobby Tables offre de bons conseils pour éviter toute interprétation erronée des données utilisateur (dans ce cas, la chaîne "Null") dans les requêtes SQL dans divers langues, y compris ColdFusion .

Il n’est pas clair d'après la question qu'il s'agisse de la source du problème et, compte tenu de la solution indiquée dans un commentaire à la première réponse (intégration des paramètres dans une structure), il semble probable qu'il s'agisse d'autre chose.

295
Alex Dupuy

Le problème peut provenir de 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 NULL est gérée. J'imagine que c'est passé comme NaN (pas un nombre). Cela gâchera SOAP un processus de dépannage des messages (plus particulièrement dans JBoss 5 serveurs ...). Je me souviens avoir étendu le codeur SOAP et effectué une vérification explicite de la façon dont NaN est traité.

(Sur une note de côté, attendez-vous à faire quelque chose d'utile si l'ID d'employé est Null, n'est-ce pas un problème de validation? Je pourrais me tromper, car je connais à peine l'exigence ...)

237
uncaught_exceptions

@ doc_180 avait le bon concept, sauf qu'il se concentre sur les chiffres, alors que l'affiche originale avait des problèmes avec les chaînes.

La solution consiste à changer le fichier mx.rpc.xml.XMLEncoder. C'est la ligne 121

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

[J'ai examiné Flex 4.5.1 SDK; les numéros de ligne peuvent différer dans d'autres versions]

Fondamentalement, la validation échoue car 'content is null' et votre argument n'est donc pas ajouté au paquet sortant SOAP _; provoquant ainsi l'erreur de paramètre manquant.

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 Opération pour utiliser votre SOAPEncoder modifié, puis incitant WebService à utiliser votre classe d'opération alternative.

J'ai passé quelques heures dessus, mais je dois passer à autre chose. Ça va probablement prendre un jour ou deux.

Vous pourrez peut-être simplement réparer la ligne XMLEncoder et effectuer des corrections sur les singes pour utiliser votre propre classe.

J'ajouterai également que si vous passez à RemoteObject/AMF avec ColdFusion, la valeur null est transmise sans problème.


Mise à jour du 16/11/201:

J'ai un dernier ajout récent à mon dernier commentaire sur RemoteObject/AMF. Si vous utilisez CF10; alors 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, sinon vous obtiendrez une erreur d'exécution. Vérifiez comme ceci:

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

Ceci est un changement de comportement par rapport à CF9; où les propriétés null se transformeraient en chaînes vides.


Modifier le 06/12/2013

Comme il y avait une question sur la façon dont les valeurs NULL sont traitées, voici un exemple d'application rapide pour montrer comment une chaîne "null" se rapportera au mot réservé 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>

La sortie de trace est:

chaîne nulle n'est pas égale à null réservé Word en utilisant la condition! =

chaîne nulle n'est pas égale à null réservé mot utilisant la condition ==

chaîne nulle n'est pas égale à null réservé Word en utilisant la condition ===

127
JeffryHouser

Traduisez tous les caractères en leurs équivalents hexadécimaux. Dans ce cas, Null serait converti en &#4E;&#75;&#6C;&#6C;

64
doogle

La chaîne d'une valeur null dans ActionScript donnera la chaîne "NULL". Je soupçonne que quelqu'un a décidé qu'il était donc judicieux de décoder la chaîne "NULL" en tant que null, provoquant ainsi la rupture que vous voyez ici - probablement parce qu'ils étaient en train de passer null Objets et obtenir des chaînes dans la base de données, quand ils ne le voulaient pas (alors assurez-vous de vérifier également ce type de bogue).

50
Andrew Aylett

En tant que piratage, vous pouvez envisager une manipulation spéciale 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 beau, mais cela pourrait résoudre le problème dans un tel cas limite.

38
Mark

Eh bien, je suppose que l'implémentation du codeur SOAP par Flex semble sérialiser de manière incorrecte les valeurs nulles. Les sérialiser en tant que String Null ne semble pas être une bonne solution. La version formellement correcte semble être de passer une valeur nulle comme:

<childtag2 xsi:nil="true" />

Ainsi, la valeur de "Null" ne serait rien d'autre qu'une chaîne valide, ce qui correspond exactement à ce que vous recherchez.

Je suppose que la résolution de ce problème dans Apache Flex ne devrait pas être si difficile à faire. Je recommanderais d’ouvrir un numéro de Jira ou de contacter les membres de la liste de diffusion Apache-flex. Cependant, cela ne corrigerait que le côté client. Je ne peux pas dire si ColdFusion sera capable de travailler avec des valeurs NULL codées de cette façon.

Voir aussi le blog de Radu Cotescu Comment envoyer des valeurs NULL dans les requêtes soapUI.

30
Christofer Dutz

C'est un kludge, mais en supposant qu'il y ait une longueur minimale pour SEARCHSTRING, par exemple 2 caractères, substring le paramètre SEARCHSTRING au second caractère et le transmettre sous la forme de deux paramètres: SEARCHSTRING1 ("Nu") et SEARCHSTRING2 ("ll").Concatenate remettez-les ensemble lors de l'exécution de la requête dans la base de données.

21
SPitBalls.com