环境:Java EE 6

如何在Interceptor中确定被调用的bean是容器管理的(CMT)还是bean管理的(BMT)?

最佳答案

根据定义,Bean始终由容器管理。

您可能想知道当前交易是CMT还是BMT。因为@AroundInvoke拦截器方法与被拦截的业务方法在同一事务中执行,所以可以使用以下方法检查事务类型:

public class SomeInterceptor {
    @Resource
    private javax.ejb.SessionContext sessionContext;

    @AroundInvoke
    public Object intercept(InvocationContext ctx) throws Exception {
        if (isCMT()) {

        }
        ...
    }

    private boolean isCMT() {
        try {
           //throws IllegalStateException if not BMT
           sessionContext.getUserTransaction();
           return false;
        }
        catch (IllegalStateException ise) {
           return true;
        }
    }
}


当然,使用异常来控制流是不好的,但是我不知道在BMT和CMT之间进行区分的替代方法。

09-28 12:51