我们有一个姓为Null的员工。 当使用该姓氏作为搜索词时,我们的员工查找应用程序将被杀死(这种情况现在经常发生)。 收到的错误(感谢Fiddler!)是:
<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>
可爱吧?
参数类型为string
。
我在用:
请注意,从ColdFusion页面将Webservice作为对象调用时,不会发生该错误。
#1楼
在xkcd注释上 , Bobby Tables网站提供了很好的建议,可以避免在包括ColdFusion在内的各种语言的SQL查询中对用户数据(在本例中为字符串“ Null”)进行不正确的解释。
从问题中尚不清楚这是否是问题的根源,并且鉴于对第一个答案的注释(包含结构中的参数)的注释中指出的解决方案似乎很可能是其他原因。
#2楼
作为一种黑客,您可以考虑在客户端进行特殊处理,将“ Null”字符串转换为永远不会发生的内容,例如XXNULLXX,然后在服务器上进行转换。
它不是很漂亮,但是可以解决这种边界情况的问题。
#3楼
这很麻烦,但是假设SEARCHSTRING
的最小长度(例如2个字符),则将SEARCHSTRING
参数放在第二个字符的substring
,然后将其作为两个参数传递: SEARCHSTRING1 ("Nu")
和SEARCHSTRING2 ("ll").
对数据库执行查询时,将它们重新Concatenate
在一起。
#4楼
在ActionScript中将null
值字符串化将得到字符串"NULL"
。 我的怀疑是,有人认为将字符串"NULL"
解码为null
是一个好主意,这会导致您在此处看到损坏—可能是因为它们在传入null
对象并在数据库中获取字符串时,他们不想要那样(因此也请务必检查这种错误)。
#5楼
将所有字符转换为其等效的十六进制实体。 在这种情况下, Null
将转换为E;KC;C;
#6楼
@ 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>
跟踪输出为:
空字符串不等于使用!=条件的空保留字
空字符串不等于使用==条件的空保留字
空字符串不等于使用===条件的空保留字
#7楼
好吧,我想Flex的SOAP编码器实现似乎错误地序列化了空值。 将它们序列化为String Null似乎不是一个好的解决方案。 形式上正确的版本似乎要传递一个null值,例如:
<childtag2 xsi:nil="true" />
因此,“ Null”的值就是有效字符串,这正是您要寻找的。
我猜想在Apache Flex中解决此问题并不难。 我建议打开一个Jira问题或与apache-flex邮件列表的人联系。 但是,这只会修复客户端。 我不能说ColdFusion是否能够使用以这种方式编码的空值。
另请参见Radu Cotescu的博客文章如何在soapUI请求中发送空值 。
#8楼
追踪
起初,我认为这是一个强制错误,其中null
被强制为"null"
并且测试"null" == null
已通过。 不是。 我很近,但是非常非常错误。 对于那个很抱歉!
从那以后,我在wonderfl.net上做了很多摆弄,并在mx.rpc.xml.*
查找了代码。 在XMLEncoder
第1795 XMLEncoder
(在3.5源代码中),在setValue
,所有XMLEncoding都归结为
currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));
本质上与以下内容相同:
currentChild.appendChild("null");
根据我的原始提琴,此代码返回一个空的XML元素。 但为什么?
原因
根据关于bug报告FLEX-33664的评论员Justin Mclean 的说法 ,以下是罪魁祸首(请参阅我的小提琴中的最后两个测试,以验证这一点):
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
}
当将currentChild.appendChild
传递给字符串"null"
,它将首先将其转换为文本为null
的根XML元素,然后针对null文字对该元素进行测试。 这是一个弱等式测试,因此将包含null的XML强制转换为null类型,或者将null类型强制转换为包含字符串“ null”的根xml元素,并且该测试通过,可能会失败。 一种解决方法是在检查XML(或其他任何东西)是否为“空”时始终使用严格的相等性测试。
解
除了在每个可恶的ActionScript版本中修复此错误之外,我能想到的唯一合理的解决方法是测试字段是否为“ null”并将 其作为CDATA值进行转义。CDATA值是变异整个文本值的最合适方法,否则将导致编码/解码问题。 例如,十六进制编码是针对单个字符的。 转义元素的整个文本时,首选CDATA值。 这样做的最大原因是它保持了人类可读性。
#9楼
问题可能出在Flex的SOAP编码器中。 尝试在Flex应用程序中扩展SOAP编码器并调试程序,以了解如何处理null值。
我的猜测是,它以NaN (不是数字)的形式传递。 这有时会弄乱SOAP消息的解组过程(最值得注意的是在JBoss 5服务器中……)。 我记得扩展了SOAP编码器,并对NaN的处理方式进行了明确的检查。