一尘不染

如何在 ActionScript 3 中将“Null”(姓氏!)传递给 SOAP Web 服务

javascript

我们有一位员工,他的姓氏为 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.

我在用:

  • WSDL (SOAP)
  • Flex 3.5
  • ActionScript 3
  • ColdFusion 8

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


阅读 185

收藏
2022-01-07

共2个答案

一尘不染

问题可能出在 Flex 的 SOAP 编码器中。尝试在您的 Flex 应用程序中扩展 SOAP 编码器并调试程序以查看如何处理空值。

我的猜测是,它作为NaN(非数字)传递。这会在某个时候弄乱 SOAP 消息解组过程(最明显的是在JBoss 5 服务器中......)。我记得扩展了 SOAP 编码器并对 NaN 的处理方式进行了显式检查。

2022-01-07
一尘不染

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

从那以后,我wonderfl.net 上做了很多摆弄,并在mx.rpc.xml.*. 在XMLEncoder(在 3.5 源代码中)的第 1795 行setValue,所有 XMLEncoding 归结为

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

这与以下内容基本相同:

currentChild.appendChild("null");

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

原因

根据关于错误报告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传递 string 时"null",它首先将其转换为带有 text 的根 XML 元素null,然后针对空文字测试该元素。这是一个弱相等性测试,因此要么将包含 null 的 XML 强制转换为 null 类型,要么将 null 类型强制转换为包含字符串“null”的根 xml 元素,并且测试通过,而它可能会失败。一种解决方法可能是在检查 XML(或任何东西,真的)“空值”时始终使用严格的相等性测试。

解决方案

除了在每个该死的 ActionScript 版本中修复这个错误之外,我能想到的唯一合理的解决方法是测试字段的“null”并将它们转义为CDATA values。

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

2022-01-07