2009-06-11 13 views
7

Estoy usando BlazeDS para controlar algunos objetos Java que estoy consumiendo en una aplicación Flex. Recibo un error de coerción de tipo con una de mis clases que no puedo entender. Tengo otras clases que funcionan bien usando los mismos tipos de datos, y he revisado mi mapeo una docena de veces. Estoy siguiendo todas las convenciones necesarias para getters y setters hasta donde yo sé ...¿Cómo puedo depurar la serialización AMF (BlazeDS) de objetos Java en Actionscript?

De todos modos, mi pregunta es: ¿cómo puedo solucionar este problema? Al ejecutar la aplicación Flex en modo de depuración escupe algunos errores genéricos en la consola que realmente no ayudan mucho (TypeError: Error # 1034: Falló la coerción de tipos: no se puede convertir Object @ 5d1d809 en valueObjects.SomeClass).

Soy nuevo en esta cosa de AMF/Flex + Java, por lo que cualquier consejo sería muy apreciado.

Respuesta

13

Estos son dos de las herramientas que uso cuando se trabaja con BlazeDS, AMF, etc .:

  • uso de una herramienta proxy HTTP que muestra las llamadas entre el cliente y el servidor, como 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).

  • Active el registro para BlazeDS. Dentro de WEB-INF/conf/services-conf.xml, baje el nivel de depuración a 'debug' como en el snippit siguiente. La salida, que es bastante detallado, aparecerá en {tomcat-home}/logs/localhost.yyyy-mm-dd.log

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

+0

Gracias! Bueno, parece que todo está siendo serializado correctamente en el lado del servidor. Cuando llega al cliente algo está vomitando. ¿Cómo puedo ver lo que está sucediendo en el cliente ya que está deserializando? – Boden

+0

Verificaría si está "vinculando" correctamente, con verdaderos objetos 1: 1 Java: AS3, tipos de datos compatibles y uso correcto de "[Bindable]" y "[RemoteClass (alias =" com.mycorp.myproj. vo.User ")]" Funciones de enlace AS3. Hay muchos ejemplos en googlenets. –

+0

Mis tipos están bien, mis alias de clase remotos son correctos y he experimentado con Bindable. Utilicé a Charles según tu sugerencia y todo vuelve del servidor con un aspecto excelente ... nombres de clase, tipos, datos, todo. Si pudiera ver la razón específica por la cual la coerción está fallando, podría ser capaz de resolver esto ... pero ahora me siento ciego. – Boden

0

usar Flex Builder y tenerlo preparado para el cliente y el servidor de depuración lado. Fue un esfuerzo configurarlo al principio, pero puedes buscar tutoriales paso a paso en Google. Me parece bastante valioso para la depuración de RPC. La última vez que revisé, Flex Builder tiene una versión de prueba gratuita y es gratis para los estudiantes y los desempleados.

2

La clase java que se está deserializando en el lado del cliente debe tener una referencia a un objeto de la clase AS3 correspondiente en la aplicación (mxml o as3). De lo contrario, la clase as3 no se cargará en el archivo swf y dará como resultado la deserialización de la clase java a un objeto as3 genérico.

actualizado Esto sucederá a pesar de tener el mapeo, getters y setters. Simplemente declare un objeto de la clase AS3 correspondiente en la sección de scripts de su mxml.

+0

En mi 'main.mxml', simplemente agrego' private const myVO: MyVO = null; 'y trabajé, gracias. –

4

La manera más fácil de comprobar en la comunicación entre los prestadores de clientes mensajes de AMF es utilizar Firefox, instalar FireBug extensión y añadir el AMF Explorer. Puede ver las solicitudes y respuestas estructuradas.

0

También vale la pena señalar que la instrumentación en Java también puede causar la pérdida de información y/o interferir con el proceso de serialización y la transmisión.

Experimenté este TypeError: Error #1034: Type Coercion failed en un proyecto (Flex < -> BlazeDS + Spring) donde nuestra capa de acceso a datos se implementó con iBatis y se activó la carga lenta - lo desactivamos ya que esa medida representaba el menor pérdida de eficiencia (teóricamente, al menos), en comparación con otras soluciones provisionales que teníamos implementadas.

Cuestiones relacionadas