Avem un angajat al cărui nume de familie este Nul. Angajatul nostru de căutare aplicație este ucis atunci când numele este folosit ca termen de căutare (care se întâmplă să fie destul de des acum). Eroarea primit (multumesc Lăutar!) este:
<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>
Drăguț, nu-i asa?
Parametrul este de tip "string".
Eu sunt, folosind:
Rețineți că eroarea nu apar atunci când calling webservice ca un obiect dintr-un ColdFusion pagina.
Am'am de făcut o mulțime de amuz pe wonderfl.net și contur prin codul în mx.rpc.xml.*
. La linia de 1795 de XMLEncoder(în 3.5 sursă), în setValue
, toate XMLEncoding se reduce la
currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));
care este în esență același ca:
currentChild.appendChild("null");
Acest cod, în conformitate cu prima mea vioara, returnează un gol element XML. Dar de ce?
Potrivit comentator Justin Mclean pe bug report FLEX-33664, următoarele este vinovat (a se vedea ultimele două teste în vioara care verifica acest lucru):
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
}
Când currentChild.appendChildeste trecut șirul
"nul", mai întâi se convertește la o rădăcină element XML cu textul
nul`, iar apoi teste care elementul împotriva null literal. Acesta este un slab egalitatea de testare, deci, fie XML conținând nul este obligat să null tip, sau null tip este constrâns să o rădăcină element xml care conțin șirul "nul", și care trece testul în cazul în care este, fără îndoială, ar trebui să nu reușesc. O singură doză ar putea fi pentru a utiliza întotdeauna strictă egalitate teste atunci când verificarea XML (sau chiar nimic) pentru "nullness."
CDATA valorile sunt cel mai potrivit mod de a evolua un text de valoare, care altfel ar cauza codare/decodare probleme. Hex de codificare, de exemplu, este destinat pentru caractere individuale. CDATA valorile sunt de preferat atunci când te're evadarea tot textul dintr-un element. Cel mai important motiv pentru aceasta este faptul că se menține umane lizibilitate.
Pe xkcd note, Bobby Mese ul are un sfat bun pentru a evita necorespunzătoare interpretare a datelor de utilizator (în acest caz, string "Nul") în interogări SQL în diferite limbi, inclusiv ColdFusion.
Nu este clar la întrebarea care este sursa problemei, și-a dat soluția menționat într-un comentariu la primul răspuns (încorporarea parametrii într-o structură) se pare că a fost altceva.
Problema ar putea fi în Flex's SĂPUN encoder. Încercați extinderea SĂPUN encoder în Flex aplicație și de a depana un program pentru a vedea cum valoarea null este tratată.
Parerea mea este, a's a trecut ca NaN (Nu este un Număr). Acest lucru va strica SĂPUN mesaj unmarshalling procesul cândva (mai ales în JBoss 5 server...). Îmi amintesc extinderea SĂPUN encoder și efectuarea în mod explicit verifica pe cât de NaN este manipulat.
@doc_180 avut dreptul de concept, cu excepția el este axat pe numere, întrucât original poster avut probleme cu siruri de caractere.
Soluția este de a schimba mx.rpc.xml.XMLEncoder
de fișier. Aceasta este linia 121:
if (content != null)
result += content;
(M-am uitat la Flex 4.5.1 SDK; numerele de linie pot fi diferite în alte versiuni.)
Practic, validare nu reușește, deoarece 'conținutul este nul' și, prin urmare, argumentul tau nu este adăugat la expediere de Pachete de SĂPUN; provocând astfel parametrul lipsă eroare.
Trebuie să extindă această clasă pentru a elimina de validare. Apoi, există un mare bulgăre de zăpadă până în lanț, modificarea SOAPEncoder să-ți folosești modificat XMLEncoder, și apoi modificarea Operațiunea de a folosi modificat SOAPEncoder, și apoi moidfying WebService pentru a folosi alternativ Operațiune de clasă.
Am petrecut câteva ore pe ea, dar am nevoie pentru a muta pe. L'll, probabil, să ia o zi sau două.
Ați putea fi capabil de a repara doar XMLEncoder linie și de a face unele maimuță colare pentru a utiliza propria clasă.
Am'll, de asemenea, adăuga că, dacă comutați la utilizarea RemoteObject/AMF cu ColdFusion, null este trecut fără probleme.
11/16/2013 actualizare:
Eu am unul mai recente plus față de ultimul meu comentariu despre RemoteObject/AMF. Dacă utilizați ColdFusion 10; apoi proprietăți cu o valoare nulă pe un obiect sunt eliminate de pe server-side object. Deci, va trebui să verificați pentru proprietățile existența înainte de a accesa sau veți obține o eroare de execuție.
Verificați ca aceasta:
<cfif (structKeyExists(arguments.myObject,'propertyName')>
<!--- no property code --->
<cfelse>
<!--- handle property normally --->
</cfif>
Aceasta este o schimbare în comportamentul de ColdFusion 9; în cazul în care nul proprietăți s-ar transforma într-siruri de caractere goale.
Edit 12/6/2013
Deoarece nu a fost o întrebare despre cât de null-uri sunt tratate, aici este o aplicație de probă pentru a demonstra cum un string "nul" se va referi la cuvântul rezervat 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>
Urme de ieșire este:
null string nu este egal cu null cuvânt rezervat folosind != starea
null string nu este egal cu null cuvânt rezervat folosind == condiție
null string nu este egal cu null cuvânt rezervat folosind === condiție
Stringifying o nul
valoare ActionScript va da string "NUL"
. Suspiciunea mea este că cineva a decis că este, prin urmare, o idee bună pentru a decoda string "NUL" "ca fiind" nul
, provocând ruperea vezi aici-probabil pentru că ei au trecut în null
obiecte și noțiuni de siruri de caractere în baza de date, atunci când acestea nu't vrei asta (astfel încât să fie sigur de a verifica pentru acest tip de bug, de asemenea).
Ca un hack, ai putea lua în considerare având o manipulare specială pe partea de client, de conversie 'Nul' string pentru ceva care nu va avea loc, de exemplu, XXNULLXX și conversia înapoi pe server.
Aceasta nu este destul, dar se poate rezolva problema pentru o astfel de limita caz.
Ei bine, cred că Flex' punerea în aplicare a SĂPUN Encoder pare a serializa valori null incorect. Serializarea le ca un Șir Nul nu't par a fi o soluție bună. Oficial versiunea corectă pare a fi să treacă o valoare nulă ca:
<childtag2 xsi:nil="true" />
Astfel valoarea de "Nul" ar fi nimic altceva decât un șir valid, care este exact ceea ce cauti.
Cred reparat în Apache Flex ar trebui't fi atât de greu pentru a obține făcut. Mi-ar recomanda deschiderea unui Jira problemă sau să contactați pe cei de la apache-flex mailinglist. Cu toate acestea, acest lucru ar rezolva doar partea de client. Pot't spune dacă ColdFusion va fi capabil de a lucra cu valori null codificate în acest fel.
A se vedea, de asemenea, Radu Cotescu's blog Cum de a trimite valori null în soapUI cereri.
L's o improvizație, dar presupunând că nu's o lungime minimă pentru SEARCHSTRING, de exemplu, 2 personaje,
subșirul " a "SEARCHSTRINGparametru la cel de-al doilea personaj și trece-l ca doi parametri în loc de:
SEARCHSTRING1 ("Nu")" și " SEARCHSTRING2 ("ll").`Înlănțui
i înapoi împreună atunci când se execută interogarea la baza de date.