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

前端之家收集整理的这篇文章主要介绍了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值。这样做的最大原因是它保持了人类的可读性。

猜你在找的Flex相关文章