EJB 将所有异常包装成 EJBException

EJB wraps all Exceptions into EJBException

假设我有一个 @Stateless bean:

@Local
public interface A {
    public void check() throws MyException {
}

@Stateless
public class AImpl implements A {
    public void check() throws MyException {
        ...
        try {
            data = getDataFromService();
        } catch (RException e) {   
            throw new MyException(e);
        }
    }
}

例外情况:

public class MyException extends Exception{}
public class RException extends RuntimeException{}

当我使用 @EJB 注释将此 bean 注入其他 class 并执行 check() 方法,我得到 EJBExceptionMyException 作为其原因...

public class B {
    @EJB private A a;
    public void start() {
        try {
            a.check();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}

如何让它抛出正确的异常?

有什么办法让它正常工作吗?

有没有办法让它在不拦截 EJBException 抛出并重新抛出其异常原因的情况下工作?

我假设您的 MyException 扩展了 RuntimeException,因此它是未经检查的异常。在这种情况下,您可以使用 @ApplicationException 注释来注释您的异常。因此,您的异常将是应用程序异常而不是系统异常。当抛出系统异常时,它被封装在EJBException中,但应用程序异常直接抛给客户端。