环境: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之间进行区分的替代方法。