ColdFusion to Flex serializer needs better error messages

I’m using Flex with ColdFusion for a long time now but sometimes I really can’t stand these two products together. I’m sending nested CFCs through the remote object back to Flex so ColdFusion has to serialize them to the form that may be understood by Flex. But I’ve got an error, somewhere I have an empty string where number is expected. You would expect that CF is smart enough to tell you what the problem is? Nope, it says:

Unable to invoke CFC - The value '' cannot be converted to a number.

And here is the stack trace:

[sourcecode lang="cf"]
        [0] "coldfusion.runtime.Cast._double(Cast.java:652)"
        [1] "coldfusion.runtime.Cast._double(Cast.java:632)"
        [2] "coldfusion.runtime.Cast._double(Cast.java:786)"
        [3] "coldfusion.flash.messaging.io.amf.Translator.CFASSerializer.translate(CFASSerializer.java:545)"
        [4] "coldfusion.flash.messaging.io.amf.Translator.CFASSerializer.translate(CFASSerializer.java:494)"
        [5] "coldfusion.flash.messaging.io.amf.Translator.CFASSerializer.translate(CFASSerializer.java:387)"
        [6] "coldfusion.flash.messaging.io.amf.Translator.CFASSerializer.translate(CFASSerializer.java:81)"
        [7] "coldfusion.flash.messaging.io.amf.Translator.CFASSerializer.translate(CFASSerializer.java:512)"
        [8] "coldfusion.flash.messaging.io.amf.Translator.CFASSerializer.translate(CFASSerializer.java:494)"
        [9] "coldfusion.flash.filter.CFCInvokeFilter.invoke(CFCInvokeFilter.java:160)"
        [10] "coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:279)"
        [11] "coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)"
        [12] "coldfusion.flash.filter.CFCInvokeDebugFilter.invoke(CFCInvokeDebugFilter.java:54)"
        [13] "coldfusion.flash.filter.CFCInvokePathFilter.invoke(CFCInvokePathFilter.java:70)"
        [14] "coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)"
        [15] "coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)"
        [16] "coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)"
        [17] "coldfusion.flash.messaging.ColdFusionAdapter.invoke(ColdFusionAdapter.java:223)"
        [18] "flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:173)"
        [19] "flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1165)"
        [20] "flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:757)"
        [21] "flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:117)"
        [22] "flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)"
        [23] "flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:48)"
        [24] "flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)"
        [25] "flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:145)"
        [26] "flex.messaging.endpoints.AMFEndpoint.service(AMFEndpoint.java:122)"
        [27] "flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:438)"
        [28] "coldfusion.flex.ColdFusionMessageBrokerServlet.service(ColdFusionMessageBrokerServlet.java:50)"
        [29] "javax.servlet.http.HttpServlet.service(HttpServlet.java:853)"
        [30] "coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)"
        [31] "jrun.servlet.FilterChain.doFilter(FilterChain.java:86)"
        [32] "coldfusion.filter.FlashRequestControlFilter.doFilter(FlashRequestControlFilter.java:71)"
        [33] "coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)"
        [34] "jrun.servlet.FilterChain.doFilter(FilterChain.java:94)"
        [35] "jrun.servlet.FilterChain.service(FilterChain.java:101)"
        [36] "jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)"
        [37] "jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)"
        [38] "jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)"
        [39] "jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)"
        [40] "jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)"
        [41] "jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)"
        [42] "jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)"
        [43] "jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)"
        [44] "jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)"
[/sourcecode]

Helpful, heh?

Why, WHY! it does not say what property is causing the problem? Surely it knows, it just keeps it for itself. Adobe – please fix!

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>