Vraag Hoe "Null" (een echte achternaam!) Doorgeven aan een SOAP-webservice in ActionScript 3?


We hebben een medewerker wiens achternaam Null is. Onze opzoektoepassing voor werknemers wordt gedood als die achternaam wordt gebruikt als zoekterm (wat nu vrij vaak gebeurt). De ontvangen fout (bedankt Fiddler!) Is:

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

Leuk, huh?

Het parametertype is string.

Ik gebruik:

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

Merk op dat de fout doet niet optreden bij het aanroepen van de webservice als een object vanaf een ColdFusion-pagina.


4474
2017-12-16 00:42


oorsprong


antwoorden:


 Het opsporen

In eerste instantie dacht ik dat dit een dwangbug was null werd gedwongen om "null" en een test van "null" == null was aan het passeren. Het is niet. Ik was dichtbij, maar zo heel erg verkeerd. Sorry daarvoor!

Ik heb sindsdien veel gedaan gedoe met wonderfl.net en tracing door de code in mx.rpc.xml.*. Op regel 1795 van XMLEncoder (in de 3.5 bron), in setValue, komt alle XMLEncoding neer op

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

wat in wezen hetzelfde is als:

currentChild.appendChild("null");

Deze code retourneert, volgens mijn oorspronkelijke viool, een leeg XML-element. Maar waarom?

 Oorzaak

Volgens commentator Justin Mclean over bugrapport FLEX-33664, het volgende is de boosdoener (zie de laatste twee tests in mijn viool welke dit verifiëren):

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
}

Wanneer currentChild.appendChild wordt de string doorgegeven "null", het converteert het eerst naar een root XML-element met tekst null, en vervolgens dat element tegen het nul letterlijke testen. Dit is een zwakke gelijkheidstest, dus ofwel wordt de XML die null bevat gedwongen naar het nultype, ofwel wordt het nultype beperkt tot een rootxml-element dat de string "null" bevat, en de test passeert waar het aantoonbaar zou moeten falen. Een oplossing kan zijn om altijd te gebruiken strikte gelijkheid test bij het controleren van XML (of iets, echt) op "nullness".

Oplossing

De enige redelijke oplossing die ik kan bedenken, in plaats van deze bug in elke verdomde versie van ActionScript op te lossen, is om velden te testen voor "null" en ontsnap als CDATA-waarden. 

CDATA-waarden zijn de meest geschikte manier om een ​​volledige tekstwaarde te muteren die anders coderings- / decoderingsproblemen zou veroorzaken. Hex-codering is bijvoorbeeld bedoeld voor individuele tekens. CDATA-waarden hebben de voorkeur wanneer u aan de volledige tekst van een element ontsnapt. De grootste reden hiervoor is dat het de leesbaarheid van de mens behoudt.


1049
2017-08-01 17:31



Op de xkcd notitie, de Bobby Tables-website heeft een goed advies om de onjuiste interpretatie van gebruikersgegevens (in dit geval de tekenreeks "Null") in SQL-query's in verschillende talen, waaronder ColdFusion.

Het is niet duidelijk uit de vraag dat dit de oorzaak van het probleem is, en gezien de oplossing opgemerkt in een opmerking bij het eerste antwoord (het inbedden van de parameters in een structuur) lijkt het waarschijnlijk dat het iets anders was.


285
2018-04-27 20:00



Het probleem zou kunnen liggen in de SOAP-encoder van Flex. Probeer de SOAP-encoder in uw Flex-toepassing uit te breiden en het programma te debuggen om te zien hoe de nulwaarde wordt afgehandeld. Mijn gok is, het is geslaagd als NaN (Geen nummer). Dit zal het proces van het ontmappen van SOAP-berichten ooit kapot maken (met name in JBoss 5 server ...). Ik herinner me dat ik de SOAP-encoder heb uitgebreid en een expliciete controle heb uitgevoerd op de manier waarop met NaN wordt omgegaan.

(Even terzijde, wordt van u verwacht dat u iets nuttigs doet als de medewerker-id Null is, is dit geen validatieprobleem? Ik zou het mis kunnen hebben, omdat ik nauwelijks de vereiste weet ...)


235
2018-01-16 08:13



@ doc_180 had het juiste concept, behalve dat hij gericht was op cijfers, terwijl de oorspronkelijke poster problemen had met tekenreeksen.

De oplossing is om de mx.rpc.xml.XMLEncoder het dossier. Dit is regel 121

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

[Ik heb gekeken naar Flex 4.5.1 SDK; regelnummers kunnen verschillen in andere versies]

Kortom, de validatie mislukt omdat 'content is null' en daarom is uw argument niet toegevoegd aan het uitgaande SOAP-pakket; waardoor de ontbrekende parameterfout wordt veroorzaakt.

U moet deze klasse uitbreiden om de validatie te verwijderen. Dan is er een grote sneeuwbal in de keten, wijzigt u SOAPEncoder om uw gewijzigde XMLEncoder te gebruiken en wijzigt u vervolgens de bewerking om uw gewijzigde SOAPEncoder te gebruiken en vervolgens WebService opnieuw te gebruiken om uw alternatieve bewerkingklasse te gebruiken.

Ik heb er een paar uur aan besteed, maar ik moet doorgaan. Het duurt waarschijnlijk een dag of twee.

Je kunt misschien gewoon de XMLEncoder-lijn repareren en wat monkey-patches uitvoeren om je eigen klasse te gebruiken.

Ik zal ook toevoegen dat als u overschakelt naar het gebruik van RemoteObject / AMF met ColdFusion, de null zonder problemen wordt doorgegeven.


Update van 11/16/2013:

Ik heb een recentere toevoeging aan mijn laatste opmerking over RemoteObject / AMF. Als u CF10 gebruikt; dan worden eigenschappen met een nulwaarde op een object verwijderd van het object serverzijde. U moet dus controleren op het bestaan ​​van de eigenschappen voordat u er toegang tot krijgt, anders krijgt u een runtime-fout. Controleer als volgt:

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

Dit is een gedragsverandering van CF9; waar de nul eigenschappen zouden veranderen in lege reeksen.


Bewerk 12-06-2013

Omdat er een vraag was over hoe nullen worden behandeld, is hier een snelle voorbeeldtoepassing om aan te tonen hoe een string "null" betrekking zal hebben op het gereserveerde woord 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>

De traceoutoutput is:

null string is niet gelijk aan nul gereserveerde woord met de voorwaarde! =

null string is niet gelijk aan nul gereserveerde woord met de == voorwaarde

null string is niet gelijk aan nul gereserveerde woord met de === voorwaarde


125
2018-05-03 15:51



Vertaal alle tekens in hun hex-entity-equivalenten. In dit geval, Null zou worden omgezet in &#4E;&#75;&#6C;&#6C;


62
2018-04-30 19:03



Stringing a null waarde in ActionScript zal de string geven "NULL". Mijn vermoeden is dat iemand heeft besloten dat het daarom een ​​goed idee is om de string te decoderen "NULL" als null, waardoor de breuk ontstaat die je hier ziet - waarschijnlijk omdat ze binnenkwamen null objecten en snaren in de database krijgen, als ze dat niet wilden (dus zorg ook voor dat soort bugs).


49
2018-04-28 20:15



Als een hack zou je kunnen overwegen een speciale afhandeling aan de clientzijde te hebben, waarbij de 'Null'-string wordt geconverteerd naar iets dat nooit zal voorkomen, bijvoorbeeld XXNULLXX en terug converteren naar de server.

Het is niet mooi, maar het kan het probleem oplossen voor zo'n grensgeval.


36
2018-04-28 08:43



Welnu, ik vermoed dat de implementatie van Flex van de SOAP-encoder null-waarden onjuist lijkt te serialiseren. Serialiseren als een String Null lijkt geen goede oplossing te zijn. De formeel correcte versie lijkt een nulwaarde door te geven als:

<childtag2 xsi:nil="true" />

Dus de waarde van "Null" zou niets anders zijn dan een geldige string, en dat is precies wat u zoekt.

Ik denk dat het moeilijk zou zijn om dit in Apache Flex opgelost te krijgen. Ik zou aanraden om een ​​Jira-probleem te openen of contact op te nemen met de jongens van de apache-flex-mailinglijst. Dit zou echter alleen de client kant repareren. Ik kan niet zeggen of ColdFusion kan werken met nul-waarden die op deze manier zijn gecodeerd.

Zie ook de blogpost van Radu Cotescu Hoe null-waarden in soapUI-verzoeken worden verzonden.


30
2017-07-17 07:56



Het is een kubus, maar ervan uitgaand dat er een minimale lengte voor is SEARCHSTRING, bijvoorbeeld 2 tekens, substring de SEARCHSTRING parameter in het tweede teken en geef deze in plaats daarvan als twee parameters door: SEARCHSTRING1 ("Nu") en SEARCHSTRING2 ("ll").  Concatenate ze weer samen bij het uitvoeren van de query naar de database.


21
2018-04-28 19:48