应用程序异常
应用程序异常向客户机提醒应用程序特定问题或业务逻辑问题;它们不会报告系统级别异常。本主题包括对如何定义应用程序异常的概述和 @ApplicationException 注解的示例,以及相应的 application-exception 部署描述符元素。
应用程序异常的定义
Bean 提供程序定义应用程序异常以及应用程序的业务逻辑。与系统异常不同,应用程序异常没有用于报告系统级别错误。相反,业务方法使用应用程序异常向客户机通知可能导致错误的应用程序级别活动;例如,业务方法的无效输入自变量值。在大多数情况下,客户机可以在遇到应用程序异常之后返回到正常处理
您可以在方法的抛出子句中定义应用程序异常。 您用于定义应用程序异常的方法可以是业务接口、无接口视图、home 接口、组件接口、消息侦听器接口或企业 Bean 的 web service 端点。您定义异常时,请记住,应用程序异常可能为:
- java.lang.Exception 异常的一个子类(直接或间接),其呈现 checked exception
- java.lang.RuntimeException 异常的子类,其呈现 unchecked exception
以下标准应用程序异常及其子类用于向客户机报告错误:
- javax.ejb.CreateException
- javax.ejb.RemoveException
- javax.ejb.FinderException
使用 EJBHome 接口和/或 EJBLocalHome 接口的创建、移除和 finder 方法定义了先前的应用程序异常。这些接口来自写入 EJB 2.1 客户机视图的组件。
在 Enterprise Java™ beans 3.0 规范中,@ApplicationException 注解只有一个可选的回滚参数。相应的应用程序/异常元素只回滚一个可选子元素,您将该子元素设置为 true 或 false。 回滚参数/子元素用于指定是否将事务标记以进行回滚。缺省情况下,该值为 false。无法指定应用程序异常的继承,在 EJB 3.0 规范中没有给出显式缺省值。除非在 Bean 的业务方法的抛出子句上定义应用程序异常,否则 EJB 3.0 规范的产品实施没有提供应用程序异常继承。 相反,EJB 3.1 规范向 @ApplicationException 注解引入了可选 inherited 参数并向相应的应用程序/异常部署描述符元素引入了可选的 inherited 子元素。 缺省情况下,将异常标记为应用程序异常导致该异常的所有子类也成为应用程序异常(即,inherited=true)。您可以通过将 @ApplicationException 的 inherited 参数设置为 false 来禁用继承行为。类似,您可以通过将部署描述符中应用程序/异常元素的 inherited 子元素设置为 false 来禁用继承行为。 有关应用程序异常的更多信息,请参阅 EJB 3.1 规范的 14.1.1 部分。
示例:使用注释继承的应用程序异常
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
}
先前示例生成以下结果:
- RTExceptionA 是具有事务回滚的应用程序异常。
- RTExceptionB 是具有事务回滚的应用程序异常。
- RTExceptionC 是没有事务回滚的应用程序异常。
- RTExceptionD 不是应用程序异常。
示例:使用 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>
与注释版本中一样,先前示例生成以下结果:
- RTExceptionA 是具有事务回滚的应用程序异常。
- RTExceptionB 是具有事务回滚的应用程序异常。
- RTExceptionC 是没有事务回滚的应用程序异常。
- RTExceptionD 不是应用程序异常。
您指定 Bean 的业务方法的抛出子句上的异常时,导致的已校验的异常是应用程序异常。 此应用程序异常的所有子类也是应用程序异常。没有选项可用于禁用已校验应用程序异常的此继承行为。您可以使用 inherited 元素来确定已校验应用程序异常子类的回滚值。如果已校验应用程序异常的 inherited 元素设置为 true 且其 rollback 元素设置为 true,那么该已校验应用程序异常的子类继承 rollback = true 值。
获取 EJB 3.0 应用程序异常继承行为:
- 您可以修改异常的 @ApplicationException 注解,方法是添加 inherited 属性并将其设置为 false。
- 您可以添加 v3.1 部署描述符并显式将 application-exception 元素的 inherited 子元素设置为 false。如果您具有现存的 v3.0 部署描述符,那么必须迁移到 v3.1 部署描述符和 XSD 模式,将应用程序/异常元素的 inherited 子元素设置为 false。
示例:使用注解来获取 EJB 3.0 应用程序异常继承行为
假设您先前具有以下代码:
import javax.ejb.ApplicationException;
@ApplicationException()
public class EJB30_RTException extends RuntimeException{
//EJB30_RTException, in EJB 3.0 subclasses were not application exceptions
}
您必须修改 @ApplicationException 注解来包含 inherited=false 属性:
import javax.ejb.ApplicationException;
@ApplicationException(inherited=false)
public class EJB30_RTException extends RuntimeException{
//EJB30_RTException, now you must explicitly set inherited to false to disable inheritance
}
示例:使用 XML 来获取 EJB 3.0 应用程序异常继承行为
假设您先前具有以下代码:
<!-- 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>
您必须修改代码以包含设置为 false 的 inherited 元素以及迁移到 v3.1 部署描述符和 XSD 模式:
<!-- 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>