How can I debug AMF (BlazeDS) serialization of Java objects to Actionscript?
Asked Answered
F

5

7

I'm using BlazeDS to remote some Java objects that I'm consuming in a Flex application. I'm getting a type coercion error with one of my classes that I can't for the life of me figure out. I have other classes that are working fine using the same data types, and I've gone over my mapping a dozen times. I'm following all of the necessary conventions for getters and setters as far as I know...

Anyhow, my question is: how can I debug this problem? Running the Flex app in debug mode spits out some generic errors to the console that don't really help much (TypeError: Error #1034: Type Coercion failed: cannot convert Object@5d1d809 to valueObjects.SomeClass.).

I'm new to this whole AMF / Flex + Java thing, so any tips would be greatly appreciated.

Faxon answered 11/6, 2009 at 6:24 Comment(0)
E
13

These are two of the tools I use when working with BlazeDS, AMF, etc.:

  • Use an HTTP proxy tool that shows the calls between your client and server, like Charles

Charles is an HTTP proxy / HTTP monitor / Reverse Proxy that enables a developer to view all of the HTTP and SSL / HTTPS traffic between their machine and the Internet. This includes requests, responses and the HTTP headers (which contain the cookies and caching information).

  • Turn on the logging for BlazeDS. Within WEB-INF/conf/services-conf.xml, lower the debugging level to 'debug' like in the below snippit. The output, which is fairly detailed, will appear in {tomcat-home}/logs/localhost.yyyy-mm-dd.log

    <target class="flex.messaging.log.ConsoleTarget" level="debug">

Errhine answered 11/6, 2009 at 6:36 Comment(6)
Thanks! Well it looks like everything is being serialized correctly on the server side. When it gets to the client something is puking. How can I see what's happening in the client as it's deserializing?Faxon
I would check to see if you are "binding" correctly, with truly 1:1 Java:AS3 objects, compatible data types and correct usage of "[Bindable]" and "[RemoteClass(alias="com.mycorp.myproj.vo.User")]" AS3 binding features. There are plenty of examples out there in the googlenets.Errhine
My types are ok, my remote class aliases are correct, and I've experimented with Bindable. I used Charles per your suggestion and everything is coming back from the server looking great....class names, types, data, everything. If I could just see the specific reason that the coercion is failing I might be able to figure this out...but right now I feel blind.Faxon
Ok, it was a binding problem as you suspected. I was marking my value objects as bindable and while this worked for some, it didn't work for all. I found a video about binding in flex and am about to watch it to see if I can get a better understanding of this stuff. Thanks again!Faxon
PS - I'm going to accept this answer because your original response did answer my original question (although suggestions for seeing what's happening in the client a little better would be great.)Faxon
Hi - sorry for resurrecting an old thread but I was about to post the exact same question when I found this. Like yourself I'd love to be able to get some feedback on why object translation fails in the client (presuming all type mappings. etc. are correct). Before I go and create a brand new question I was just wondering what the Binding issue you mention towards the end was? ie: is it something generic?Forgery
C
4

The easiest way to check on the communication between service-clients AMF messages is to use FireFox, install FireBug extension and add the AMF Explorer. You can see the structured requests and responses.

Crooked answered 31/1, 2011 at 11:25 Comment(0)
L
2

The java class that is being deserialized in the client side must have a reference to an object of the corresponding AS3 class in the application (mxml or as3). Otherwise, the as3 class will not be loaded in the swf file and will result in deserializing the java class to a generic as3 object.

updatedThis will happen despite having the mapping, getters and setters. Just declare an object of the corresponding AS3 class in script section of your mxml.

La answered 14/7, 2010 at 18:4 Comment(1)
In my main.mxml, I just add private const myVO:MyVO = null; and I worked, thank you.Longawa
N
0

I use Flex Builder and have it set up for both client and server side debugging. It was a pain to set up at first, but you can Google for step-by-step tutorials. I find it quite valuable for debugging RPCs. Last I checked, Flex Builder has a free trial and is free to students and the unemployed.

Neoterism answered 18/6, 2009 at 9:18 Comment(0)
O
0

It's also worth noting that instrumentation in Java can also cause a loss of information and/or interfere with the serialization process and stream.

I've experienced this TypeError: Error #1034: Type Coercion failed on a project (Flex<->BlazeDS+Spring) where our data-access layer was implemented with iBatis and had lazy-loading switched on - we turned it off as that measure represented the lesser loss of efficiency (theoretically, at least), as compared to other workarounds we had in place.

Orgel answered 25/3, 2011 at 15:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.