Java EJB事务-静态上下文-坏主意? 形势
想象一下: 有这样一个枚举:Java EJB事务-静态上下文-坏主意? 形势,java,static,ejb,code-injection,Java,Static,Ejb,Code Injection,想象一下: 有这样一个枚举: enum State{ INITIAL{ @Override public void proceed(){...} }, NEXT_STATE{ @Override public void proceed(){ ... } }, //and so on TERMINATED; public void proceed(){} } 然后是一个@实体。此实体表示处理订单的应用程序中的usesase。我们称之为
enum State{
INITIAL{
@Override
public void proceed(){...}
},
NEXT_STATE{
@Override
public void proceed(){ ... }
},
//and so on
TERMINATED;
public void proceed(){}
}
然后是一个@实体。此实体表示处理订单的应用程序中的usesase。我们称之为ActivationUseCase
ActivationUseCase
(与从我的UseCase
基类继承的任何其他类一样)有一个名为state的属性,该属性包含一个状态
putzzle的最后一部分是EJB3.1bean,它检索ActivationSecase
并对其调用procedure()
其思想是让@实体
保存有关其可能状态(枚举)的所有信息,并且每个状态都知道在必须时要做什么。继续()
问题
在procedure()方法中,我们有一个静态上下文。但是我们可能想调用其他EJB。所以有人开始做JNDI查找(本地)并调用我们需要的bean。
我觉得这很难看也很危险,但这不是问题所在
为了清楚起见,这里有一堆伪调用:
MyServiceBean.myServiceMethod()
|- ActivationUseCase.proceed()
|- ManuallyLookedUpEJB.anotherServiceMethod()
因此,MyServiceBean.myServiceMethod()
启动一个事务,检索activationSecase
实例以调用它的procedure()
。然后,我们查找手动查找pejb
(新的InitialContext()…)并调用另一个ServiceMethod()
问题
交易发生了什么?从哪里开始?它是否会涵盖另一种服务方法()
?我如何调试这个
免责声明
我不想讨论枚举包含逻辑构造(现在)。事实上,我正在收集重构(重写)整件事的理由。我只需要一些理由来支持我的观点,即这种构造不是一个好主意。事务将像任何其他方法调用一样传播。因此,除非
ManuallyLookedUpEJB.anotherServiceMethod()
有一个新的事务传播,否则它将在由MyServiceBean.myServiceMethod()
启动的同一个事务中执行。谢谢您的回复。在@Entity内的静态上下文中手动查找JNDI不是问题吗?很好。你说的“在静态上下文中”是什么意思?状态为[ENUM_VALUE].continue()的代码是在静态上下文中执行的。这就是我们进行JNDI查找以手动查找EdupeJB并对其调用另一个ServiceMethod()的地方。这就是我所说的静态上下文