内容来自 DOC[ https://q.houxu6.top/?s=如何在ActionScript 3中将"Null"(一个真实的姓氏!)传递给SOAP Web服务](https://q.houxu6.top/?s=如何在ActionScript 3中将"Null"(一个真实的姓氏!)传递给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>
很可爱,对吧?
参数类型是string
。
我正在使用:
注意,错误不会在从ColdFusion页面调用webservice作为对象时发生。
追踪问题
一开始我以为这是一个强制转换错误,其中 null
被强制转换为 "null"
,并且 "null" == null
测试通过。但不是这样的。我非常接近了,但非常、非常错误。抱歉!
后来我在 wonderfl.net 上做了很多调试,并跟踪了 mx.rpc.xml.*
中的代码。在 XMLEncoder
的第1795行(在3.5源代码中),在 setValue
函数中,所有的 XMLEncoding 都归结为:
currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));
这本质上与:
currentChild.appendChild("null");
根据我的原始 fiddle,这段代码返回一个空的 XML 元素。但是为什么?
原因
根据评论者 Justin Mclean 在 bug 报告 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 的 XML 被强制转换为 null 类型,要么 null 类型被强制转换为包含字符串 "null" 的根 xml 元素,测试通过了,尽管它可能应该失败。一个修复方案可能是在检查 XML(或任何内容)是否为“null”时始终使用严格的等式测试。
解决方案
除了修复此 ActionScript 版本中的每个 damn 版本的 bug 之外,我能想到的唯一合理的解决方法是测试字段是否为“null”,并将它们转义为 CDATA 值。CDATA 值是避免编码/解码问题的最合适的方式。 例如十六进制编码,它适用于单个字符。当您需要转义元素的整个文本时,CDATA 值是首选的。这样做的最大原因是它保持了可读性。
标签:XML,Web,null,姓氏,ActionScript,Null,SOAP From: https://www.cnblogs.com/xiaomandujia/p/17762995.html