@ doc_180 мав правильну концепцію, за винятком того, що він зосереджений на числах, тоді як в оригінальному плакаті були проблеми з рядками.
Рішення - змінити mx.rpc.xml.XMLEncoder
файл. Це рядок 121:
if (content != null)
result += content;
(Я переглянув Flex 4.5.1 SDK; номери рядків можуть відрізнятися в інших версіях.)
В основному, перевірка не вдається, оскільки "вміст є нульовим", і тому ваш аргумент не додається до вихідного пакету SOAP; таким чином викликаючи помилку відсутнього параметра.
Ви повинні розширити цей клас, щоб видалити перевірку. Потім з'являється велика снігова куля в ланцюзі, модифікуючи SOAPEncoder для використання вашої модифікованої XMLEncoder, а потім модифікуючи Операцію для використання зміненого SOAPEncoder, а потім мобілізуючи WebService для використання альтернативного класу операцій.
Я витратив на це кілька годин, але мені потрібно рухатись далі. Можливо, це займе день чи два.
Можливо, ви зможете просто виправити лінію XMLEncoder і зробити кілька виправлень мавп щоб використовувати свій власний клас.
Я також додам, що якщо перейти на використання RemoteObject / AMF з ColdFusion, нуль передається без проблем.
16.11.2013 оновлення :
У мене є ще одне нещодавнє доповнення до мого останнього коментаря про RemoteObject / AMF. Якщо ви використовуєте ColdFusion 10; потім властивості з нульовим значенням об’єкта видаляються з об’єкта на стороні сервера. Отже, вам потрібно перевірити наявність властивостей перед тим, як отримати доступ до нього, або ви отримаєте помилку виконання.
Перевірте так:
<cfif (structKeyExists(arguments.myObject,'propertyName')>
<!--- no property code --->
<cfelse>
<!--- handle property normally --->
</cfif>
Це зміна поведінки від ColdFusion 9; де нульові властивості перетворилися б на порожні рядки.
Редагувати 6.12.2013
Оскільки виникло питання про те, як обробляються нулі, ось короткий зразок програми, який продемонструє, як рядок "null" буде ставитися до зарезервованого слова 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>
Вихід сліду:
рядок null не дорівнює нулю зарезервованого слова, використовуючи умову! =
рядок null не дорівнює нульовому зарезервованому слову, використовуючи умову ==
рядок null не дорівнює нульовому зарезервованому слову, використовуючи умову ===