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() 方法,我得到 EJBException 以 MyException 作为其原因...
public class B {
@EJB private A a;
public void start() {
try {
a.check();
} catch (MyException e) {
e.printStackTrace();
}
}
}
如何让它抛出正确的异常?
有什么办法让它正常工作吗?
有没有办法让它在不拦截 EJBException 抛出并重新抛出其异常原因的情况下工作?
我假设您的 MyException
扩展了 RuntimeException
,因此它是未经检查的异常。在这种情况下,您可以使用 @ApplicationException
注释来注释您的异常。因此,您的异常将是应用程序异常而不是系统异常。当抛出系统异常时,它被封装在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() 方法,我得到 EJBException 以 MyException 作为其原因...
public class B {
@EJB private A a;
public void start() {
try {
a.check();
} catch (MyException e) {
e.printStackTrace();
}
}
}
如何让它抛出正确的异常?
有什么办法让它正常工作吗?
有没有办法让它在不拦截 EJBException 抛出并重新抛出其异常原因的情况下工作?
我假设您的 MyException
扩展了 RuntimeException
,因此它是未经检查的异常。在这种情况下,您可以使用 @ApplicationException
注释来注释您的异常。因此,您的异常将是应用程序异常而不是系统异常。当抛出系统异常时,它被封装在EJBException中,但应用程序异常直接抛给客户端。