flex – 如何将“Null” 传递给ActionScript 3中的SOAP Web服务?

我们有一个名字为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>

可爱,是吗?

参数类型为字符串。

我在用:

> WSDL(SOAP)。
> Flex 3.5
> ActionScript 3
> ColdFusion 8

请注意,从ColdFusion页面将Web服务调用为对象时,不会发生错误。

解决方法

跟踪它

起初,我认为这是一个强制错误,其中null被强制为“null”和一个“null”== null的测试通过。不是。我很近,但是非常,非常错了。对于那个很抱歉!

我自从做了很多的fiddling on wonderfl.net和跟踪通过mx.rpc.xml。*中的代码。在XMLEncoder的第1795行(在3.5源中),在setValue中,所有的XMLEncoding都归结为

currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));

其基本上与以下相同:

currentChild.appendChild("null");

这段代码,根据我原来的小提琴,返回一个空的XML元素。但为什么?

原因

根据评论家Justin Mclean的错误报告FLEX-33664,以下是罪魁祸首(见我在fiddle的最后两个测试验证这一点):

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(或任何东西,真的)为“nullness”时总是使用strict equality测试。


我可以想到的唯一合理的解决方法,没有修复这个bug在每个死的版本的ActionScript,是测试字段为“null”,并将它们转义为CDATA values

CDATA值是突变整个文本值(否则会导致编码/解码问题)的最合适的方法。例如,Hex编码用于单个字符。当您转义元素的整个文本时,首选CDATA值。这样做的最大原因是它保持了人类的可读性。

相关文章

一:display:flex布局display:flex是一种布局方式。它即可以...
1. flex设置元素垂直居中对齐在之前的一篇文章中记载过如何...
移动端开发知识点pc端软件和移动端apppc端软件是什么,有哪些...
最近挺忙的,准备考试,还有其他的事,没时间研究东西,快周...
display:flex;把容器设置为弹性盒模型(设置为弹性盒模型之后...
我在网页上运行了一个Flex应用程序,我想使用Command←组合键...