CDI:截获的方法嵌套调用来自同一个bean的非截获方法 - 应该调用?

时间:2011-08-05 20:58:26

标签: java nested cdi interceptor jboss-weld

如果我有方法

public List<IrcEvent> getEventsByCriteria(IrcEventCriteria crit, boolean descending) {
    return getEventsByCriteria(crit, 0, Integer.MAX_VALUE, descending);
}

@JpaTransactional
public List<IrcEvent> getEventsByCriteria(IrcEventCriteria crit, int first, int count, boolean descending) {
     ...
}

然后第一个方法也必须注释@JpaTransactional吧?

我刚刚发现当bean调用自己的拦截方法时,拦截器不会被触发。 我认为那是因为它不是被调用的代理,而是“真实实例”本身,因此它不会通过代理。

这是否包含在spec / docs中?我还没找到。 我问,因为我想确定如果我注释所有公共方法,他们将来不会多次开始调用拦截器。

2 个答案:

答案 0 :(得分:1)

我不记得在规范中看到它,但这是代理工作的方式。但无论如何,这与事务传播有关 - 无论是否使用现有正在运行的事务调用事务方法都应该启动新事务。

获取Seam 3 persistence模块(具有事务支持)

答案 1 :(得分:1)

第二次“内部”调用不再通过上下文引用,因此不会被截获。