【发布时间】:2010-10-12 15:10:12
【问题描述】:
是否可以“自注入”EJB 以将本地方法调用为 bean 方法?在某些情况下这可能是有利的,例如,如果使用容器管理的事务并且应该在新事务中完成某些事情。
这是如何工作的示例:
Foo.java:
@Local
public interface FoO {
public void doSomething();
public void processWithNewTransaction(); // this should actually be private
}
FooBean.java:
@Stateless
public class FooBean implements Foo {
@EJB
private Foo foo;
public void doSomething() {
...
foo.processWithNewTransaction();
...
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void processWithNewTransaction() {
...
}
}
如果我将processWithNewTransaction() 提取到另一个bean,它需要在接口中作为公共方法公开,即使它只能由FooBean 调用。 (我上面的代码也有同样的问题,这就是接口定义中有注释的原因。)
一种解决方案是切换到 bean 管理的事务。但是,这需要更改整个 bean 来管理自己的事务,并且会为所有方法添加大量样板。
【问题讨论】:
-
作为以下答案的补充:如果您不想在本地接口中使用新事务的方法,您可以使用
@Local(Foo.class)和@LocalBean注释您的 bean 实现并拥有该方法仅作为实现类中的公共方法。 -
OP - 请更新此选项以取消选中不正确的所选答案。