Domanda Come passare "Null" (un vero cognome!) A un servizio Web SOAP in ActionScript 3?


Abbiamo un dipendente il cui cognome è Null. La nostra applicazione di ricerca dipendente viene uccisa quando il cognome viene utilizzato come termine di ricerca (che capita di essere abbastanza spesso ora). L'errore ricevuto (grazie a Fiddler!) È:

<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>

Carino, eh?

Il tipo di parametro è string.

Sto usando:

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

Si noti che l'errore non  si verificano quando si chiama il webservice come oggetto da una pagina ColdFusion.


4474
2017-12-16 00:42


origine


risposte:


 Rintracciarlo

All'inizio ho pensato che si trattasse di un bug di coercizione in cui null stava diventando forzato a "null" e una prova di "null" == null stava passando. Non è. Ero vicino, ma così molto, molto sbagliato. Mi dispiace per quello!

Da allora ho fatto un sacco di cose giocherellando su wonderfl.net  e tracciare il codice in mx.rpc.xml.*. Alla riga 1795 di XMLEncoder (nella sorgente 3.5), in setValue, tutto il XMLEncoding si riduce a

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

che è essenzialmente lo stesso di:

currentChild.appendChild("null");

Questo codice, secondo il mio violino originale, restituisce un elemento XML vuoto. Ma perché?

 Causa

Secondo il commentatore Justin Mclean sul bug report FLEX-33664 , il seguente è il colpevole (vedi le ultime due prove nella mia violino  che verificano questo):

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
}

quando currentChild.appendChild è passata la stringa "null", prima lo converte in un elemento XML radice con testo nulle quindi verifica quell'elemento rispetto al valore letterale null. Questo è un test di uguaglianza debole, quindi il XML contenente null è forzato al tipo nullo, oppure il tipo nullo è forzato a un elemento xml root contenente la stringa "null", e il test passa dove probabilmente dovrebbe fallire. Una correzione potrebbe essere quella di utilizzare sempre uguaglianza rigorosa  prova quando si controlla XML (o qualsiasi cosa, davvero) per "nullità".

Soluzione

L'unica soluzione ragionevole che riesco a pensare, a meno di correggere questo bug in ogni dannata versione di ActionScript, è testare i campi per "null" e sfuggirli come Valori CDATA .  

I valori CDATA sono il modo più appropriato per mutare un intero valore di testo che altrimenti causerebbe problemi di codifica / decodifica.  La codifica esadecimale, ad esempio, è pensata per singoli caratteri. I valori CDATA sono preferiti quando si esegue l'escape dell'intero testo di un elemento. La più grande ragione per questo è che mantiene la leggibilità umana.


1049
2017-08-01 17:31



Sul nota xkcd , il Sito Web di Bobby Tables  ha buoni consigli per evitare l'interpretazione impropria dei dati dell'utente (in questo caso, la stringa "Null") nelle query SQL in varie lingue, incluso Fusione fredda .

Non è chiaro dalla domanda che questa sia la fonte del problema, e data la soluzione annotata in un commento alla prima risposta (incorporando i parametri in una struttura) sembra probabile che fosse qualcos'altro.


285
2018-04-27 20:00



Il problema potrebbe essere nel codificatore SOAP di Flex. Prova ad estendere l'encoder SOAP nella tua applicazione Flex e fai il debug del programma per vedere come viene gestito il valore nullo. La mia ipotesi è che è passato come NaN  (Non un numero). Ciò incasinerà il processo di smantellamento dei messaggi SOAP qualche volta (in particolare in JBoss  5 server ...). Ricordo di aver esteso l'encoder SOAP e di aver eseguito un controllo esplicito su come viene gestito NaN.

(Nota a margine, ci si aspetta che faccia qualcosa di utile se ID del dipendente è Null, non è un problema di validazione? Potrei sbagliarmi, dato che a malapena conosco il requisito ...)


235
2018-01-16 08:13



@ doc_180 aveva il concetto giusto, tranne che si concentrava sui numeri, mentre il poster originale aveva problemi con le stringhe.

La soluzione è cambiare il mx.rpc.xml.XMLEncoder file. Questa è la linea 121

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

[Ho guardato l'SDK di Flex 4.5.1; i numeri di riga possono differire in altre versioni]

Fondamentalmente, la validazione fallisce perché 'content is null' e quindi il tuo argomento non viene aggiunto al pacchetto SOAP in uscita; causando così l'errore di parametro mancante.

Devi estendere questa classe per rimuovere la convalida. Poi c'è una grande palla di neve sulla catena, modificando SOAPEncoder per usare XMLEncoder modificato, e poi modificando Operation per usare SOAPEncoder modificato, e poi moidfying WebService per usare la classe Operazione alternativa.

Ci ho passato qualche ora, ma devo andare avanti. Probabilmente ci vorrà un giorno o due.

Potresti riuscire a correggere la linea XMLEncoder e ad eseguire alcune patch di scimmia per utilizzare la tua classe.

Aggiungerò anche che se si passa a utilizzare RemoteObject / AMF con ColdFusion, il null viene passato senza problemi.


Aggiornamento 16/11/2013 :

Ho aggiunto un'ultima aggiunta al mio ultimo commento su RemoteObject / AMF. Se si utilizza CF10; quindi le proprietà con un valore nullo su un oggetto vengono rimosse dall'oggetto lato server. Quindi, è necessario verificare l'esistenza delle proprietà prima di accedervi o si otterrà un errore di runtime. Controlla come questo:

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

Questo è un cambiamento nel comportamento da CF9; dove le proprietà nulle si trasformerebbero in stringhe vuote.


Modifica il 12/6/2013

Poiché c'era una domanda su come i null sono trattati qui è una rapida applicazione di esempio per dimostrare come una stringa "null" si riferisca alla parola riservata 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>

L'output di traccia è:

la stringa nulla non è uguale alla parola riservata null usando la condizione! =

la stringa nulla non è uguale alla parola riservata null usando la condizione ==

la stringa nulla non è uguale alla parola riservata null usando la condizione ===


125
2018-05-03 15:51



Traduci tutti i personaggi nei loro equivalenti esadecimali. In questo caso, Null sarebbe convertito in &#4E;&#75;&#6C;&#6C;


62
2018-04-30 19:03



Stringificare a null valore in ActionScript  darà la stringa "NULL". Il mio sospetto è che qualcuno abbia deciso che è, quindi, una buona idea decodificare la stringa "NULL" come null, causando la rottura che vedi qui - probabilmente perché stavano passando null oggetti e ottenere stringhe nel database, quando non lo volevano (quindi assicurati di controllare anche questo tipo di bug).


49
2018-04-28 20:15



Come un hack, potresti considerare di avere una gestione speciale sul lato client, convertendo la stringa "Null" in qualcosa che non si verificherà mai, ad esempio XXNULLXX e la conversione sul server.

Non è bello, ma può risolvere il problema per un caso limite.


36
2018-04-28 08:43