Tratamiento de excepciones de Java en Flex utilizando el paquete de integración de Spring con BlazeDS




Spring tiene un proyecto, denominado Spring BlazeDS Integration, cuyo objetivo es facilitar el desarrollo de aplicaciones ricas de internet que utilicen java y Spring en el back end y Adobe Flex en el front end. Con este proyecto podemos exponer como destinos remotos objetos gestionados por el contenedor, de modo que podamos invocar desde Flex sus métodos, hacer uso de las facilidades del Data Centric Development de Flash Builder 4 y dar tratamiento personalizado a las excepciones de Java, entre otras cosas.

Introducción

Normalmente en el código Java, y más frecuentemente en la capa de acceso a datos, se pueden generar excepciones que se propagan hasta la interfaz de usuario. Si por ejemplo utilizamos un componente RemoteObject para invocar un método de una clase Java, y éste genera una excepción durante su ejecución, podemos acceder a la información de ésta si hemos definido un manejador para el evento “fault” del componente.

Como sabemos, las excepciones de Java pueden ser disímiles, y atendiendo a la condición que las causa la cantidad de información que portan es variable. Las excepciones generadas por las operaciones de acceso a datos son por lo general muy explicativas, e incluyen prácticamente un reporte detallado de la causa, que puede ser una violación de integridad referencial, una violación de llave duplicada, etc. Esta información por lo general se encuentra fuera de dominio de los usuarios finales de la aplicación y además de abrumarlos no les aporta información útil. En estas condiciones es cuando puede ser útil un mecanismo que traduzca esas excepciones en otras que porten información útil para el usuario final.

Desarrollo

Para mostrar el funcionamiento del mecanismo de traducción de excepciones del paquete de integración de Spring con BlazeDS, desarrollaremos una pequeña aplicación de ejemplo en la que desde Flex invoquemos un método de Java que genere una excepción y veremos cómo se maneja, luego incorporaremos el mecanismo de traducción de excepciones, invocaremos nuevamente el método y compararemos los resultados.

Como entorno de trabajo utilizaremos Flash Builder 4 plug-in instalado sobre el paquete galileo del Eclipse IDE for Java EE Developers, BlazeDS 4, spring-framework-3.0.2.RELEASE y spring-flex-1.0.3.RELEASE.

Comenzaremos por crear un proyecto combinado Flex/Java:

Clipboard01
Clipboard02

A continuación añadiremos todo lo que tiene que ver con Spring al proyecto.

  1. Una vez descargado el framework spring extraemos en la carpeta ExceptionTranslationDemo\WEB-INF\lib\ el contenido de la carpeta “dist” del archivo previamente descargado.
  2. Descargamos “cglib-nodep-2.2.jar” y lo copiamos en ExceptionTranslationDemo\WEB-INF\lib\
  3. Descargamos “backport-util-concurrent.jar” y lo copiamos en ExceptionTranslationDemo\WEB-INF\lib\
  4. Descargamos “aopalliance.zip” y copiamos el archivo “aopalliance.jar” en ExceptionTranslationDemo\WEB-INF\lib\
  5. Descargamos “spring-flex-1.0.3.RELEASE.zip” y copiamos los archivos de la carpeta “dist” en ExceptionTranslationDemo\WEB-INF\lib\

Para configurar la integración de Spring con BlazeDS, modificamos el archivo “web.xml” que se encuentra en ExceptionTranslationDemo\WEB-INF para que quede de la siguiente manera:

[xml]


BlazeDS
BlazeDS Application

flex.messaging.HttpFlexSession


Spring MVC Dispatcher Servlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation /WEB-INF/spring/web-application-config.xml
1


Spring MVC Dispatcher Servlet
/messagebroker/*


RDSDispatchServlet
RDSDispatchServlet
flex.rds.server.servlet.FrontEndServlet
useAppserverSecurity false
messageBrokerId _messageBroker
10


RDSDispatchServlet
/CFIDE/main/ide.cfm


index.html
index.htm


[/xml]

Seguidamente modificamos la sección “<services></services>” del archivo “services-config.xml” que se encuentra en ExceptionTranslationDemo\WEB-INF\flex\, y que originalmente viene así:

[xml]





[/xml]

Para que quede de esta manera:

[xml]





[/xml]

Dentro de ExceptionTranslationDemo\WEB-INF creamos la carpeta “spring” y en ella creamos el archivo web-application-config.xml con el siguiente contenido:

[xml]



[/xml]

Lo próximo que haremos será crear una clase con un método donde se realice una operación que genera una excepción. Dentro de la carpeta “src” del proyecto crearemos el paquete “com.et.services” y dentro crearemos la clase “ExceptionTranslationService.java” con el siguiente código:

[java]
package com.et.services;

public class ExceptionTranslationService {

public void generateException(){
Object x = new Integer(0);
((String)x).concat(“123”);
}
}
[/java]

Como vemos, la línea “((String)x).concat(“123”);“ generará una excepción de tipo “ClassCastException”. Ahora crearemos una interface de usuario sencilla que invoque el método a través de un objeto “RemoteObject” y veremos lo que ocurre, pero primeramente registramos un objeto de tipo “ExceptionTranslationService” en Spring y lo publicamos como destino remoto. El archivo “web-application-config.xml” queda ahora de la siguiente manera:

[xml]




[/xml]

Nuestra interfaz de usuario, definida en el archivo “ExceptionTranslationDemo.mxml” en la carpeta “flex-src” queda así:

[mxml]









[/mxml]

Compilamos el proyecto, desplegamos la aplicación en Tomcat y cuando la corremos y oprimimos el botón obtenemos este mensaje de error:

Clipboard03

La información de la excepción generada por el método Java llegó a Flex a través de las propiedades “faultString” y “faultDetails” del objeto “event.fault” del manejador del evento “fault” del componente “RemoteObject”. Estas propiedades contienen la misma información que las propiedades del mismo nombre del objeto “event.message”, que es de tipo “mx.messaging.messages.ErrorMessage”, la propiedad “rootCause” de esta clase contiene toda la información del objeto “Throwable” de Java.

Lo que haremos será interceptar el objeto “Throwable” de Java (del cual heredan las excepciones) en su tránsito hacia Flex y en su lugar generar un objeto de tipo “flex.messaging.MessageException” con la información personalizada, para lo cual nos auxiliaremos del mecanismo de traducción de excepciones del paquete spring-flex.

Comenzamos por crear el paquete “com.et.exceptions” dentro de la carpeta “src” del proyecto y dentro creamos la clase “CustomExceptionTranslation.java” que implementa la interface “org.springframework.flex.core.ExceptionTranslator”:

[java]
package com.et.exceptions;

import org.springframework.flex.core.ExceptionTranslator;

import flex.messaging.MessageException;

public class CustomExceptionTranslation implements ExceptionTranslator {

@Override
public boolean handles(Class arg0) {
// TODO Auto-generated method stub
return false;
}

@Override
public MessageException translate(Throwable arg0) {
// TODO Auto-generated method stub
return null;
}
}
[/java]

El método “handles” indica cuándo se invoca al método “translate” ante una excepción dada, en nuestro caso el método “handles” queda así:

[java]
public boolean handles(Class arg0) {
if(arg0.isInstance(new ClassCastException())){
return true;
}
return false;
}
[/java]

Y el método “translate” así:

[java]
public MessageException translate(Throwable arg0) {
if(arg0 instanceof ClassCastException){
MessageException result = new MessageException();
result.setDetails(“No se puede convertir un Integer en un String”);
result.setMessage(“Error de conversion de tipo”);
return result;
}
return null;
}
[/java]

Finalmente registramos el objeto de tipo “CustomExceptionTranslation” en Spring e informamos al “MessageBroker” que lo use como traductor de excepciones, el archivo “web-application-config.xml” queda finalmente de la siguiente manera:

[xml]






[/xml]

Compilamos el proyecto, redesplegamos la aplicación y cuando la corremos nuevamente obtenemos lo siguiente:

Clipboard04

Como vemos, la excepción original fue interceptada y en su lugar llegó a Flex un objeto de tipo MessageException con información personalizada, el código Flex no sufrió ninguna alteración. El proyecto final (sin el contenido de ExceptionTranslationDemo\WEB-INF\lib\) se puede bajar aqui.

Conclusiones

Hemos visto como utilizar el mecanismo de traducción de excepciones de Java a Flex que incorpora spring-flex y su utilidad utilizando una excepción “sencilla”, pero si en vez de ser una excepción de este tipo hubiera sido alguna de las generadas por la capa de acceso a datos (utilizando Hibernate, iBatis o JPA), la cantidad de información que llega al cliente es considerablemente mayor y carente de sentido para el usuario final. Por ejemplo, el siguiente mensaje se obtiene ante una excepción generada por la capa de acceso a datos en una aplicación que no usa el mecanismo de traducción:

Clipboard05

Luego de incorporar el mecanismo de traducción de excepciones el mensaje obtenido es el siguiente:

Clipboard06

El código Flex no fue modificado en absoluto.

4 Comentarios

  1. Pingback: de la red – 4/06/2010 « Tecnologías y su contexto

  2. Pingback: Tweets that mention MadeInFlex » Blog Archive » Tratamiento de excepciones de Java en Flex utilizando el paquete de integración de Spring con BlazeDS -- Topsy.com

  3. jorge

    hola estoy probando su ejemplo y me el siguiente error

    [MessagingError message=’Destination ‘ExceptionTranslationBean’ either does not exist or the destination has no channels defined (and the application does not define any default channels.)’]
    Couldn’t establish a connection to ‘ExceptionTranslationBean’

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acerca de Made In Flex

Made In Flex es una comunidad de desarrolladores de Apache Flex creada en 2006.

Apache Flex, anteriormente conocido como Adobe Flex, es un SDK (kit de desarrollo de software) para crear aplicaciones enriquecidas - multiplataforma basadas en Adobe Flash donado por Adobe a la fundación Apache in 2011 y promocionado a proyecto de primer nivel en Diciembre de 2012.

Actualmente estamos cambiando muchos aspectos del sitio web para ofrecer un sitio útil para toda la comunidad que tenga en cuenta las necesidades actuales.

Últimas Fotos

Instalador de Apache Flex

Entrar o Registrase