情况
想象一下:
有一个这样的枚举:
enum State{
INITIAL{
@Override
public void proceed(){...}
},
NEXT_STATE{
@Override
public void proceed(){ ... }
},
//and so on
TERMINATED;
public void proceed(){}
}
然后有一个@Entity。该实体表示处理订单的应用程序中的用例。让我们称之为ActivationUseCase
。ActivationUseCase
(就像从我的基类继承的任何其他类一样UseCase
)有一个名为 state 的属性,其中包含一个State
.
最后一个问题是一个 EJB 3.1 bean,它检索一个ActivationUseCase
并在其上调用proceed()。
这个想法是让@Entity
持有所有关于它的可能状态(枚举)的信息,并且每个状态都知道当它必须做什么时该做什么.proceed()
。
问题
在proceed() 方法中,我们有一个静态上下文。但我们可能想调用其他 EJB。所以有人开始做 JNDI 查找(本地)并调用我们需要的 bean。恕我直言,这非常丑陋和危险,但这不是这里的问题。
为了清楚起见,这里有一堆伪调用:
MyServiceBean.myServiceMethod()
|- ActivationUseCase.proceed()
|- ManuallyLookedUpEJB.anotherServiceMethod()
所以MyServiceBean.myServiceMethod()
启动一个事务,检索ActivationUseCase
实例以调用proceed()
它。然后我们查找ManuallyLookedUpEJB
(new InitialContext()...) 并调用anotherServiceMethod()
.
问题
交易会发生什么?它从哪里开始?会覆盖anotherServiceMethod()
吗?我该如何调试这个?
免责声明
我不想讨论 enum-contains-logic 构造(现在)。事实上,我正在收集重构(重写)整个事情的原因。我只需要一些理由来支持我的说法,即这种结构不是一个好主意。