【问题标题】:How to catch exception of a method of session bean如何捕获会话 bean 方法的异常
【发布时间】:2012-06-12 13:00:40
【问题描述】:

我有一个无状态会话 bean,其方法抛出异常(从 Exception 扩展)。

@Stateless
@LocalBean
public class MyBean {
    ...
    public void myMethod() throws MyException {
        ...
    }
}

但我无法捕捉到异常。

try {
    myBean.myMethod
} catch (MyException e) {
    ...
}

这里是堆栈: WARNING: StandardWrapperValve[MyServlet]: PWC1406: Servlet.service() for servlet MyServlet threw exception java.lang.IllegalAccessError: example/MyException at $Proxy327.myMethod(Unknown Source) at example.EJB31_Generated_MyBean_Intf_Bean_.myMethod(Unknown Source) at example.MyServlet.processRequest(MyServlet.java:36) at example.MyServlet.doGet(MyServlet.java:71) ...

我认为,这是因为调用 bean 方法是通过代理。我怎样才能捕捉到异常?或者应该避免在会话 bean 中抛出异常的方法? - 我希望不会。

【问题讨论】:

  • “我无法捕捉到异常”是什么意思?当 bean 方法抛出 MyException 时会发生什么?
  • 不捕获异常时也是如此。我在问题中添加了堆栈。

标签: jakarta-ee ejb


【解决方案1】:

因为堆栈跟踪显示它实际上是一个 IllegalAccessError 被抛出...请参阅它的 API 文档:http://docs.oracle.com/javase/6/docs/api/java/lang/IllegalAccessError.html

您将无法通过添加catch (Exception e) {...}... 来捕获它,因为它是一个错误,它不是异常的子类。如果你真的想抓住它,你必须添加一个catch (Throwable t) {...},我强烈反对。而是找到引发错误的原因。我认为我们需要查看更多您的代码...

正如 API 所说的“通常,编译器会捕获此错误;如果类的定义发生不兼容的更改,则此错误只会在运行时发生”...您是否在服务器和客户端上重新部署以确保使用相同的接口定义?

【讨论】:

  • 我忘记将异常公开。我必须为这个指控向 JaveEE 道歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2012-10-16
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多