Question 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és est supprimée lorsque ce nom est utilisé comme terme de recherche (ce qui arrive souvent 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 fait pas se produit lors de l'appel du service Web en tant qu'objet à partir d'une page ColdFusion.


4474
2017-12-16 00:42


origine


Réponses:


 Le traquer

Au début, je pensais que c'était un bug de coercition où null était contraint de "null" et un test de "null" == null Passait. Ce n'est pas. J'étais proche, mais tellement, très mal. Désolé pour ça!

J'ai depuis fait beaucoup de jouer du violon sur wonderfl.net et traçant à travers le code dans mx.rpc.xml.*. À la ligne 1795 de XMLEncoder (dans la source 3.5), dans setValue, tout le XMLEncoding se résume à

currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));

qui est essentiellement le même que:

currentChild.appendChild("null");

Ce code, d'après 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, ce qui suit est le coupable (voir les deux derniers tests dans mon violon qui vérifie cela):

var thisIsNotNull:XML = <root>null</root>;
if(thisIsNotNull == null){
    // always branches here, as (thisIsNotNull == null) strangely returns true
    // despite the fact that thisIsNotNull is a valid instance of type XML
}

Quand currentChild.appendChild est passé la chaîne "null", il le convertit d'abord en un élément XML racine avec du texte null, puis teste cet élément par rapport au littéral null. Ceci est un test d'égalité faible, donc le XML contenant null est contraint au type null, ou le type null est contraint à un élément XML racine contenant la chaîne "null", et le test passe où il devrait sans doute échouer. Une solution pourrait être de toujours utiliser égalité stricte tests lors de la vérification XML (ou quoi que ce soit, vraiment) pour "nullité".

Solution

La seule solution de contournement raisonnable à laquelle je puisse penser, à part de corriger ce bug dans chaque foutue version d'ActionScript, est de tester les champs pour "null" et échapper à eux comme Valeurs CDATA. 

Les valeurs CDATA sont le moyen le plus approprié pour muter une valeur de texte entière qui provoquerait autrement des problèmes de codage / décodage. L'encodage 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 à cela est qu'elle maintient la lisibilité humaine.


1049
2017-08-01 17:31



Sur le note xkcd, la Site Web de Bobby Tables a de bons conseils pour éviter l'interprétation incorrecte des données de l'utilisateur (dans ce cas, la chaîne "Null") dans les requêtes SQL dans diverses langues, y compris Fusion froide.

Il n'est pas clair à partir de la question que c'est la source du problème, et étant donné la solution notée dans un commentaire à la première réponse (en intégrant les paramètres dans une structure), il semble probable que c'était quelque chose d'autre.


285
2018-04-27 20:00



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. Ma conjecture est, il est passé en tant que NaN (Pas un nombre). Cela va gâcher un processus SOAP message unmarshalling parfois (notamment dans JBoss 5 serveur ...). Je me souviens d'avoir étendu le codeur SOAP et d'avoir effectué une vérification explicite de la façon dont NaN est géré.

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


235
2018-01-16 08:13



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

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

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

[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 'content is null' et par conséquent votre argument n'est 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, en modifiant SOAPEncoder pour utiliser votre XMLEncoder modifié, puis en modifiant Operation pour utiliser votre SOAPEncoder modifié, puis en utilisant WebService pour utiliser votre autre classe Operation.

J'ai passé quelques heures dessus, mais j'ai besoin de passer à autre chose. Cela prendra probablement un jour ou deux.

Vous pourrez peut-être simplement corriger la ligne XMLEncoder et faire quelques correctifs 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 16/11/2013:

J'ai ajouté un dernier ajout à mon dernier commentaire sur RemoteObject / AMF. Si vous utilisez CF10; 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:

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

C'est un changement de comportement de CF9; où les propriétés null deviendraient des chaînes vides.


Éditer 12/06/2013

Comme il y avait une question sur la façon dont les nulls sont traités ici est un exemple d'application rapide pour dé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 au mot réservé null en utilisant la condition! =

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

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


125
2018-05-03 15:51



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


62
2018-04-30 19:03



Stringifier un null valeur en ActionScript donnera la chaîne "NULL". Mon soupçon est que quelqu'un a décidé qu'il est, par conséquent, une bonne idée de décoder la chaîne "NULL" comme null, provoquant la casse que vous voyez ici - probablement parce qu'ils passaient 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 ce genre de bug, aussi).


49
2018-04-28 20:15



En tant que hack, 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 convertissant de nouveau sur le serveur.

Ce n'est pas joli, mais cela peut résoudre le problème pour un tel cas limite.


36
2018-04-28 08:43