@ doc_180 miał właściwą koncepcję, tyle że skupiał się na liczbach, podczas gdy oryginalny plakat miał problemy z łańcuchami.
Rozwiązaniem jest zmiana mx.rpc.xml.XMLEncoder
pliku. To jest linia 121:
if (content != null)
result += content;
(Patrzyłem na Flex 4.5.1 SDK; numery linii mogą się różnić w innych wersjach.)
Zasadniczo sprawdzanie poprawności kończy się niepowodzeniem, ponieważ „treść jest pusta” i dlatego argument nie jest dodawany do wychodzącego pakietu SOAP; powodując w ten sposób błąd braku parametru.
Musisz rozszerzyć tę klasę, aby usunąć sprawdzanie poprawności. Następnie jest duża śnieżka w górę łańcucha, modyfikująca SOAPEncoder, aby używał zmodyfikowanego XMLEncodera, a następnie modyfikuje Operację, aby używać zmodyfikowanego SOAPEncodera, a następnie moidfying WebService, aby użyć alternatywnej klasy Operacji.
Spędziłem nad tym kilka godzin, ale muszę przejść dalej. To zajmie prawdopodobnie dzień lub dwa.
Możesz być w stanie po prostu naprawić linię XMLEncoder i zrobić trochę łatania małp, aby użyć własnej klasy.
Dodam też, że jeśli przełączysz się na używanie RemoteObject / AMF z ColdFusion, zerowanie jest przekazywane bez problemów.
Aktualizacja z 16.11.2013 :
Mam jeszcze jeden najnowszy dodatek do mojego ostatniego komentarza na temat RemoteObject / AMF. Jeśli używasz ColdFusion 10; następnie właściwości z wartością zerową na obiekcie są usuwane z obiektu po stronie serwera. Musisz więc sprawdzić istnienie właściwości przed uzyskaniem do niej dostępu, w przeciwnym razie pojawi się błąd czasu wykonywania.
Sprawdź w ten sposób:
<cfif (structKeyExists(arguments.myObject,'propertyName')>
<!--- no property code --->
<cfelse>
<!--- handle property normally --->
</cfif>
Jest to zmiana zachowania w stosunku do ColdFusion 9; gdzie właściwości zerowe zamieniłyby się w puste ciągi.
Edytuj 12.06.2013
Ponieważ pojawiło się pytanie o to, jak traktowane są wartości zerowe, oto krótka przykładowa aplikacja pokazująca, jak ciąg „null” będzie odnosił się do słowa zarezerwowanego 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>
Dane wyjściowe śledzenia to:
ciąg zerowy nie jest równy null zarezerwowanemu słowu przy użyciu warunku! =
ciąg zerowy nie jest równy null zarezerwowanemu słowu przy użyciu warunku ==
ciąg zerowy nie jest równy null zarezerwowanemu słowu przy użyciu warunku ===