Excepciones de aplicación

Las excepciones de aplicación alertan al cliente de problemas específicos de la aplicación o de lógica empresarial; no informan de excepciones a nivel de sistema. Este tema incluye una breve visión general de cómo se definen las excepciones de aplicación y ejemplos de la anotación @ApplicationException y el elemento de descriptor de despliegue application-exception correspondiente.

Definición de excepción de aplicación

Los proveedores de beans definen excepciones aplicación junto con la lógica empresarial de una aplicación. A diferencia de las excepciones del sistema, las excepciones de aplicación no se utilizan para notificar errores a nivel de sistema. En lugar de estos, los métodos de negocio utilizan excepciones de aplicación para notificar al cliente una actividad a nivel de aplicación que podría provocar errores; por ejemplo, valores de argumentos de entrada no válidos a un método de negocio. En la mayoría de los casos, los clientes pueden volver al proceso normal después de experimentar excepciones de aplicación

Puede definir excepciones de aplicación en la cláusula throws de un método. El método que se utiliza para definir la excepción de aplicación puede ser el de una interfaz de empresa, vista sin interfaz, interfaz inicial, interfaz de componente, interfaz de escucha de mensajes o punto final de servicios web del enterprise bean. Cuando defina la excepción, recuerde que las excepciones de aplicación pueden ser:

  • Una subclase, ya sea directa o indirecta, de la excepción java.lang.Exception, que representa una excepción comprobada
  • Una subclase de la excepción java.lang.RuntimeException, que representa una excepción no comprobada
Atención: No se puede definir una excepción de aplicación como subclase de java.rmi.RemoteException porque esta excepción y sus subclases son para problemas a nivel de sistema.

Las excepciones de aplicación estándar siguientes y sus subclases se utilizan para informar de errores al cliente:

  • javax.ejb.CreateException
  • javax.ejb.RemoveException
  • javax.ejb.FinderException

Las excepciones de aplicación anteriores se definen en los métodos de creación, de eliminación y buscador de la interfaz EJBHome, la interfaz EJBLocalHome, o ambas. Estas interfaces proceden de los componentes grabados en la vista de cliente EJB 2.1.

En la especificación de Enterprise Java™ beans 3.0, la anotación @ApplicationException sólo tenía un parámetro opcional de retrotracción. El elemento application-exception de la aplicación correspondiente sólo tenía un subelemento opcional, rollback, que se establece en true o false. El parámetro/subelemento rollback se utiliza para especificar si la transacción se marca para la retrotracción. De manera predeterminada este valor es false. La herencia de una excepción de aplicación no se ha podido especificar y no se ha proporcionado un valor predeterminado explícito en la especificación EJB 3.0. La implementación del producto de la especificación EJB 3.0 no proporcionaba herencia de excepciones de aplicación, a menos que se hubiera definido una excepción de aplicación en la cláusula throws de un método de negocio de un bean. Por el contrario, la especificación EJB 3.1 ha introducido el parámetro opcional inherited a la anotación @ApplicationException y el subelemento opcional inherited al elemento del descriptor de despliegue application-exception correspondiente. De forma predeterminada, al marcar una excepción como excepción de aplicación, todas las subclases de dicha excepción también serán excepciones de aplicación (es decir, inherited=true). Puede inhabilitar el comportamiento de herencia estableciendo el parámetro inherited de @ApplicationException en false. Asimismo, puede inhabilitar el comportamiento de herencia estableciendo el subelemento inherited del elemento application-exception del descriptor de despliegue en false. Para obtener más información sobre las excepciones de aplicación, consulte la sección 14.1.1 de la especificación EJB 3.1.

Ejemplo: Excepciones de aplicaciones de herencia utilizando anotaciones

import javax.ejb.ApplicationException;

@ApplicationException(inherited=true, rollback=true)
public class RTExceptionA extends RuntimeException{

   //RTExceptionA
   
}
public class RTExceptionB extends RTExceptionA{

   //RTExceptionB

}
import javax.ejb.ApplicationException;

@ApplicationException(inherited=false, rollback=false)
public class RTExceptionC extends RTExceptionB{

   //RTExceptionC

}
public class RTExceptionD extends RTExceptionC{

   //RTExceptionD 
   
}

El ejemplo anterior genera los resultados siguientes:

  • RTExceptionA es una excepción de aplicación con retrotracción de transacción.
  • RTExceptionB es una excepción de aplicación con retrotracción de transacción.
  • RTExceptionC es una excepción de aplicación sin retrotracción de transacción.
  • RTExceptionD no es una excepción de aplicación.

Ejemplo: Excepciones de aplicaciones de herencia utilizando XML

public class RTExceptionA extends RuntimeException{

   //RTExceptionA
   
}
public class RTExceptionB extends RTExceptionA{

   //RTExceptionB

}
public class RTExceptionC extends RTExceptionB{

   //RTExceptionC

}
public class RTExceptionD extends RTExceptionC{

   //RTExceptionD 
   
}
<!-- Example ejb-jar.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
    metadata-complete="true" version="3.1">
    <assembly-descriptor>
        <application-exception>
            <exception-class>myXML.example.package.RTExceptionA</exception-class>
            <rollback>true</rollback>
            <inherited>true</inherited>
        </application-exception>
        <application-exception>
            <exception-class>myXML.example.package.RTExceptionC</exception-class>
            <rollback>false</rollback>
            <inherited>false</inherited>
        </application-exception>
    </assembly-descriptor>
</ejb-jar> 

Al igual que en la versión de anotación, el ejemplo anterior genera los resultados siguientes:

  • RTExceptionA es una excepción de aplicación con retrotracción de transacción.
  • RTExceptionB es una excepción de aplicación con retrotracción de transacción.
  • RTExceptionC es una excepción de aplicación sin retrotracción de transacción.
  • RTExceptionD no es una excepción de aplicación.
Recuerde: Puede utilizar los subelementos rollback e inherited de application-exception para sustituir explícitamente los valores de los atributos rollback e inherited especificados o establecidos implícitamente por la anotación @ApplicationException.

Cuando se especifica una excepción en la cláusula throws de un método de negocio de un bean, la excepción comprobada resultante es una excepción de aplicación. Todas las subclases de esta excepción de aplicación también son excepciones de aplicación. No hay ninguna opción disponible para inhabilitar este comportamiento de herencia de excepciones de aplicación comprobadas. Puede utilizar el elemento inherited para determinar el valor de retrotracción de las subclases de excepción de aplicación comprobada. Si el elemento inherited de la excepción de aplicación comprobada se establece en true y el elemento rollback se establece en true, las subclases de dicha excepción de aplicación comprobada heredan el valor rollback = true.

Obtención del comportamiento de herencia de la excepción de aplicación EJB 3.0:

Tiene las opciones siguientes si tiene una aplicación EJB 3.0 existente y desea que el comportamiento de herencia de excepción de aplicación siga siendo false, lo que significa que la subclases de una excepción de aplicación no son excepciones de la aplicación.
  • Puede modificar la anotación @ApplicationException de la excepción añadiendo el atributo inherited y estableciéndolo en false.
  • Puede añadir un descriptor de despliegue de la versión 3.1 y establecer explícitamente el subelemento inherited del elemento application-exception en false. Si tiene un descriptor de despliegue existente de la versión 3.0, debe migrar a un descriptor de despliegue y esquema XSD de la versión 3.1 y establecer el subelemento inherited de application-exception en false.

Ejemplo: Obtener el comportamiento de herencia de la excepción de aplicación EJB 3.0 con anotaciones:

Supongamos que antes tenía el código siguiente:

import javax.ejb.ApplicationException;

@ApplicationException()
public class EJB30_RTException extends RuntimeException{

   //EJB30_RTException, en subclases de EJB 3.0 no eran excepciones de aplicación 
   
}

Debe modificar la anotación @ApplicationException para incluir el atributo inherited=false:

import javax.ejb.ApplicationException;

@ApplicationException(inherited=false)
public class EJB30_RTException extends RuntimeException{

   //EJB30_RTException, ahora debe establecer explícitamente inherited en false para inhabilitar la herencia
   
}

Ejemplo: Obtener el comportamiento de herencia de la excepción de aplicación EJB 3.0 con XML:

Supongamos que antes tenía el código siguiente:

<!-- Example ejb-jar.xml -->

<?xml version="1.0" encoding="UTF-8"?>
  <ejb-jar id="ejb-jar_ID" xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
      metadata-complete="true" version="3.0">
    <assembly-descriptor>
        <application-exception>
            <exception-class>myXML.example.package.EJB30_RTException</exception-class>
        </application-exception>
    </assembly-descriptor>
</ejb-jar> 

Debe modificar el código para que incluya el elemento inherited establecido en false y también migrar a un descriptor de despliegue y un esquema XSD de la versión 3.1:

<!-- Example ejb-jar.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
    metadata-complete="true" version="3.1">
    <assembly-descriptor>
        <application-exception>
            <exception-class>myXML.example.package.EJB30_RTException</exception-class>
            <rollback>false</rollback>
            <inherited>false</inherited>
        </application-exception>
    </assembly-descriptor>
</ejb-jar> 

Icon that indicates the type of topic Concept topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cejb_app_exception
File name: cejb_app_exception.html