@ doc_180具有正确的概念,只不过他专注于数字,而原始的发帖人则有字符串问题。
解决方案是更改mx.rpc.xml.XMLEncoder
文件。这是第121行:
if (content != null)
result += content;
(我查看了Flex 4.5.1 SDK;其他版本的行号可能有所不同。)
基本上,验证失败是因为“内容为空”,因此您的参数未添加到传出SOAP数据包中。从而导致丢失参数错误。
您必须扩展此类以删除验证。然后,链上的滚雪球滚滚了,将SOAPEncoder修改为使用修改后的XMLEncoder,然后将Operation修改为使用修改后的SOAPEncoder,然后将WebService修改为使用备用Operation类。
我花了几个小时,但我需要继续前进。可能需要一两天。
您也许可以修复XMLEncoder行,并进行一些猴子修补程序以使用您自己的类。
我还要补充一点,如果您切换到将RemoteObject / AMF与ColdFusion一起使用,则可以毫无问题地传递null。
2013年11月16日更新:
我最近对RemoteObject / AMF的评论中还有一个新内容。如果您使用的是ColdFusion 10;然后将对象上具有空值的属性从服务器端对象中删除。因此,您必须在访问属性之前检查属性是否存在,否则会遇到运行时错误。
像这样检查:
<cfif (structKeyExists(arguments.myObject,'propertyName')>
<!--- no property code --->
<cfelse>
<!--- handle property normally --->
</cfif>
与ColdFusion 9相比,这是行为上的变化;null属性将变成空字符串。
编辑12/6/2013
由于存在关于如何处理null的问题,因此这里有一个快速的示例应用程序来演示字符串“ 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>
跟踪输出为:
空字符串不等于使用!=条件的空保留字
空字符串不等于使用==条件的空保留字
空字符串不等于使用===条件的空保留字