温馨提示:本文翻译自stackoverflow.com,查看原文请点击:apache flex - How to pass "Null" (a real surname!) to a SOAP web service in ActionScript 3
coldfusion soap apache-flex actionscript wsdl

apache flex - 如何在ActionScript 3中将“ Null”(真实的姓氏)传递给SOAP Web服务

发布于 2020-04-14 11:08:47

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

我在用:

  • WSDLSOAP
  • Flex 3.5
  • 动作脚本3
  • ColdFusion 8

请注意,从ColdFusion页面将Webservice作为对象调用时,不会发生该错误

查看更多

提问者
bill
被浏览
70
2017-05-23 20:18

追踪

起初我以为这是一个强制性错误,null正在被强制"null"并且通过了测试"null" == null不是。我很近,但是非常非常错误。对于那个很抱歉!

从那以后,我已经对wonderfl.net进行了很多摆弄,在中查找了代码mx.rpc.xml.*XMLEncoder(在3.5源中)的第1795行,在中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",它首先将其转换为带有text的根XML元素null,然后针对null文字对该元素进行测试。这是一个弱等式测试,因此将包含null的XML强制转换为null类型,或者将null类型强制转换为包含字符串“ null”的根xml元素,并且该测试通过了可能会失败的地方。一种解决方法是在检查XML(或其他任何东西)是否为“空”时始终使用严格的相等性测试。

除了在每个可恶的ActionScript版本中修复此错误之外,我能想到的唯一合理的解决方法是测试字段是否为“ null”并将其作为CDATA值进行转义

CDATA值是变异整个文本值的最合适方法,否则将导致编码/解码问题。例如,十六进制编码是针对单个字符的。在转义元素的整个文本时,首选CDATA值。这样做的最大原因是它保持了人类可读性。