我们有一位姓 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。
string
我在用:
请注意,从 ColdFusion 页面将 Web 服务作为对象调用时不会发生错误。
起初我认为这是一个强制错误,null被强制执行"null"并且测试"null" == null通过了。它不是。我很接近,但非常非常错误。对于那个很抱歉!
null
"null"
"null" == null
从那以后,我在 Wonderfl.net 上做了很多摆弄,并在mx.rpc.xml.*. 在XMLEncoder(在 3.5 源代码中)的第 1795 行setValue,所有 XMLEncoding 归结为
mx.rpc.xml.*
XMLEncoder
setValue
currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));
这基本上与以下内容相同:
currentChild.appendChild("null");
根据我原来的小提琴,这段代码返回一个空的 XML 元素。但为什么?
根据评论者 Justin Mclean 关于错误报告FLEX-33664 的说法,以下是罪魁祸首(请参阅我的小提琴中的最后两个测试来验证这一点):
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传递 string"null"时,它首先将其转换为带有 text 的根 XML 元素null,然后针对 null 文字测试该元素。这是一个弱相等性测试,所以要么包含 null 的 XML 被强制为 null 类型,要么 null 类型被强制为包含字符串“null”的根 xml 元素,并且测试通过了它可能失败的地方。一种解决方法可能是在检查 XML(或任何东西,真的)时总是使用严格的相等测试来确定“nullness”。
currentChild.appendChild
我能想到的唯一合理的解决方法是,除了在每个该死的 ActionScript 版本中修复这个错误之外,测试字段是否为“null”并将它们转义为CDATA 值。
CDATA 值是改变整个文本值的最合适方法,否则会导致编码/解码问题。例如,十六进制编码用于单个字符。当您转义元素的整个文本时,首选 CDATA 值。最大的原因是它保持了人类的可读性。