miércoles, 26 de octubre de 2011

Manejo de Excepciones en EJB 3

¿Debiera una transacción retrotraerse cuando se lanza una excepción y ésta no se captura? En EJB 2, sólo se retrotrae automáticamente la transacción en el caso de excepciones no chequeadas (subclases de RuntimeException). Para lograr el mismo resultado con excepciones chequeadas, era necesario capturar dichas excepciones, marcar manualmente la transacción como "fallida" y luego relanzar la excepción:


        } catch (AccessDeniedException e) {
            getSessionContext().setRollbackOnly();
            throw e;
        }
        ...

En EJB 3, esto ya no es necesario, ya que existe la posibilidad de definir esto en la misma excepción:

        @ApplicationException(rollback=true)
        public class ServiceException extends Exception {...

de esta manera, el contenedor EJB sabe que, de lanzarse este tipo de excepciones y no ser capturadas, la transacción activa debe retrotraerse.

Más información:

http://today.java.net/article/2006/04/04/exception-handling-antipatterns

Bienvenida

Este es mi primer posteo, espero publicar información útil y una que otra opinión.