【问题标题】:AroundInvoke and checked exceptionsAroundInvoke 和检查的异常
【发布时间】:2015-08-10 13:07:35
【问题描述】:

我有一个关于 AroundInvoke 注释的问题。假设我有一个带有方法 a 的 bean,它在某些 Interceptor 中使用带有注释的方法来增强。方法 a 在签名中没有任何异常,而“增强”方法可以抛出一些已检查的异常。没有编译错误,但是在运行时会发生什么情况,当这种情况发生时(如在@AroundInvoke 方法中抛出这个检查的异常)?它会被转换为某个运行时异常吗?

【问题讨论】:

    标签: java exception exception-handling ejb


    【解决方案1】:

    interceptor 1.2 specification(截至本文的最新版本)未指定此场景的行为,因此行为将是特定于产品的。我不建议依赖该行为,除非产品记录了该行为并且您对特定于产品的依赖关系没问题。我怀疑大多数实现都会抛出某种未经检查的异常(很可能是 EJBException 或 UndeclaredThrowableException)。我知道 WebSphere Application Server 会抛出 EJBException。

    【讨论】:

      【解决方案2】:

      拦截器的 at aroundinvoke 之所以被标记为抛出一个受检异常,是因为我们确实不知道被拦截的方法可以抛出什么,是受检异常还是未受检异常。 考虑用户定义了一个ApplicationException 被拦截方法抛出的场景,那么拦截器在正常情况下应该将此异常传播给客户端。

      在极少数情况下,拦截方法应该抛出异常,除非它执行一些横切逻辑(但这并不意味着拦截器)。

      但是,如果由拦截器或被拦截的方法抛出异常,并且该异常没有注释ApplicationException,ejb 运行时必须将其包装到EJBException 中并重新抛出它。如果它是 ApplicationException,则 ejb 容器不得包装到 EjBException 中,并且必须按原样将其传播到客户端。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        相关资源
        最近更新 更多