gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:57:46 25 4
gpt4 key购买 nike

EJB 3.1 session 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注解。这将接口(interface)指定为本地接口(interface),或者在 bean 上使用时(在您的情况下)可用于指向本地接口(interface)(通过 value 属性)。这两种情况都不适用于此。您给出的代码也将无法编译。 Lookup("Foo") 将返回一个需要转换的对象。

无论如何,EJB 容器不会丢失任何信息,而是将异常包装在 EJBException 中。这是因为 FooException 最终继承自 RuntimeException。容器将任何此类异常视为非应用程序异常,并且 EJB 规范定义应将这些异常包装起来。

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

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

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

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

关于java - 如何在Session Beans中使用自定义异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com