如何在Session Beans中使用自定义异常?

2024-02-04

EJB 3.1 会话 Bean:

import javax.ejb.*;
public class FooException extends EJBException {
}
@Stateless @Local
public class Foo {
  public void bar() throws FooException {
    if (/* something wrong */) {
      throw new FooException();
    }
  }
}

现在测试:

import org.junit.*;
public class FooTest {
  @Test(expected = FooException.class)
  public void testException() {
    new InitialContext().lookup("Foo").bar();
  }
}

问题是EJBException被困在测试中,而不是FooException。看起来 EJB 容器丢失了有关我的自定义异常类型的信息并抛出基本类型(EJBException)。这里有什么问题吗? (这是 OpenEJB 3.1)


首先,这里不需要使用@Local注解。这将接口指定为本地接口,或者在 bean 上使用时(在您的情况下)可用于指向本地接口(通过 value 属性)。这两种情况都不适用于此。您给出的代码也将无法编译。 Lookup("Foo") 将返回一个需要转换的对象。

不管怎样,EJB 容器不会丢失任何信息,而是将异常包装在 EJBException 中。这是因为 FooException 最终继承自 RuntimeException。容器将任何此类异常视为nonapplication exception对于这些,EJB 规范定义它们应该被包装。

在您的情况下,您已经从 EJBException 扩展,因此这似乎是一个极端情况。例如,JBoss AS 6 在这种情况下不会进行额外的包装,但显然 OpenEJB 会这样做。

您可以通过不让 FooException 继承 EJBException 或通过在测试中捕获异常、解开它并重新抛出解开的异常来解决此问题。

由于您的 bar 方法声明它抛出 FooException,所以我的猜测是您没有意识到 EJBException 是 RuntimeException,因此是非应用程序异常。为什么要让FooException继承EJBException呢?您认为这是出于某种需要,还是需要满足某些特殊目的?

(作为额外提示,请确保您了解应用程序异常和非应用程序异常在回滚任何事务和销毁池 bean 方面的区别)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Session Beans中使用自定义异常? 的相关文章

随机推荐

  • 如何使用 Eleventy 将多个 Markdown 文件合并到 Nunjucks 模板中?

    CONTEXT Eleventy 和 Nunjucks 以及 Markdown 大量长文本 使用 Markdown 更容易创建 编辑 复杂的布局 对于 SSG 来说还是新手 GOAL 使用 Markdown 管理文本内容块 将这些 Mark
  • 打印日历月

    实现打印给定月份和年份的日历的函数 首先 提示用户 Enter the month and year 一旦用户输入有效的输入 由空格分隔的两个整数 就以类似于 UNIX 输出的格式打印出日历cal命令 例如 如果用户输入03 2014 输出
  • 了解 Spark 结构化流并行性

    我是 Spark 世界的新手 正在努力解决一些概念 使用来自 Kafka 的 Spark Structured Streaming 采购时 并行性是如何发生的 让我们考虑以下代码片段 SparkSession spark SparkSess
  • AWS Lambda 中 Python 全局变量的范围

    AWS Lambda 中全局变量的范围或生命周期是多少 例如 如果我做这样的事情 cache def lambda handler event context do something with cache do something els
  • 显示我的“乘坐优步前往那里”按钮的预计到达时间和预计金额选项

    我已将 搭乘 Uber 前往那里 按钮集成到我的应用程序中 我觉得 如果我显示目的地的预计到达时间和预计价格 对用户来说会更方便 我怎样才能实现这个目标 我现在正在遵循本指南 https github com uber rides ios
  • 将 RGB 图像数组乘以标量后,使用 plt.imshow 获取黑色图

    所以我有点困惑为什么会发生这种情况 I have a binary image 现在我想将此二进制图像转换为 RGB 空间 因此我使用dstack连接第三轴的函数 Everything works fine so far but now I
  • 从数组中删除 JSON 对象会创建“未定义”对象

    我在使用 JSON 和数组时遇到一些问题 我已经摆弄 JSON 一段时间了 并尝试通过重构旧的实现来在生产中使用一些 JSON 我有两个隐藏的文本字段 一个以 1 2 3 等格式存储 id 另一个名称 name1 name2 name3 所
  • 如何在git上共享Xcode性能测试基线?

    I have performance tests on Xcode with a baseline set as shown below 这些基线似乎是本地保存的 如断点 因此我对它们的更改不会通过 git 传输 当除了我之外的任何人运行我
  • dropzone.js 使用 content-type 直接上传到 S3

    我目前正在使用 dropzone js 通过预先签名的 URL 将图像上传到 S3 一切正常 除了我无法设置正在上传的文件的内容类型 默认情况下 它们都是通过以下方式上传的binary octet stream我无法直接在浏览器中查看它们
  • 从 github 安装/运行 gradle 插件(特别是 arquilian 插件)的正确方法?

    我想在这里使用 arquillian 插件来运行 jetty 8 https github com aslakknutsen arquillian gradle plugin https github com aslakknutsen ar
  • 詹金斯即将关闭

    有时会发生奇怪的事情 詹金斯开始显示 詹金斯将关闭 即使没有人打开此消息并重新启动詹金斯 截屏 我有一个 精简备份 插件 该插件被配置为在备份后关闭 更改了此设置 现在工作正常 找到它有点棘手 因为这个插件不在配置系统下 而是在管理詹金斯下
  • 将字典列表转换为单独的列 pandas

    我想要一个有 1 列字典列表的 df 示例 df testData 1 MLB 2 NBA 3 NFL 分为以下内容 Number Sport 1 MLB 2 NBA 3 NFL 我尝试过以下方法 pd DataFrame df testD
  • Objective C:Posing 可以在 ios 上使用吗?

    我正在尝试为一个 ios 项目实现摆姿势 场景 在运行时定义控制器类 https stackoverflow com questions 29424934 defining class of controller at run time 我
  • PHP、SQL通过php变量限制查询

    PHP代码定义变量sqlshowvalue sqlshowvalue 5 if isset POST showmore sqlshowvalue 5 所以我连接到我的数据库 然后当我使用上面刚刚定义的变量运行下面的 SQL 查询时 resu
  • 跟踪类实例中的状态

    我想创建一个具有某些内部状态 可能是加载 错误或成功 的类 我还想在类上有一些可以检查此类状态的方法 理想的API function f x LoadingError
  • 如何使用.net更改Word文档的字体大小

    我正在使用 C 和 Spire Doc 开发一个应用程序 它将 Word 文档保存为指定的格式 其中包括标题处的徽标以及指定的字体大小和样式 现在我可以使用 spire doc 在标题处粘贴徽标 但我无法更改font风格和size整个文件的
  • iPhone 表格单元格标签未对齐

    如同上一个问题 https stackoverflow com questions 1770872 text misalignment on tableview cells on iphone device 我的表格单元格中的文本对齐有问题
  • JWT 令牌与 AJAX、非 AJAX、JQuery

    我对在登录 提交和重定向期间管理 JWT 令牌感到有点沮丧 在开始之前 先介绍一下我的技术堆栈 以防万一 JQuery Html gt Node Js gt Java Restful Services gt MySQL 我的 java Re
  • 有什么方法可以触发 RDTSC 的传统模式吗?

    我重写了整个问题 人们显然不理解 RDTSC 用于计算 CPU 周期 它随 CPU 限制而变化 目前 RDTSC 不随 CPU 限制而变化 一些旧的应用程序期望 RDTSC 随 CPU 限制而变化 我如何让 RDTSC 满足他们的期望 我不
  • 如何在Session Beans中使用自定义异常?

    EJB 3 1 会话 Bean import javax ejb public class FooException extends EJBException Stateless Local public class Foo public