考虑以下场景:
无状态注释类 ClassOne
@Stateless
public class ClassOne {
// some injected fields
// ....
@Inject
private ClassTwo classTwo;
// ....
public void methodInClassOne() {
try {
classTwo.methodInClassTwo();
} catch(Exception e) {
// handle exception
}
}
}
无状态注释类 ClassTwo
@Stateless
public class ClassTwo {
// some injected fields
// ....
@Inject
private ClassThree classThree;
// ....
public void methodInClassTwo {
try{
classThree.methodInClassThree();
} catch (Exception e) {
// handle exception
}
}
}
非注释类 ClassThree
public class ClassThree {
// some injected fields
// ....
public void methodInClassThree {
// some business logic
// ....
if (conditionCheck) {
throw new RuntimeException("error message");
}
}
}
比如说,对于这种情况,上面的conditionCheck总是评估为true。这是截至今天的工作代码。RuntimeException 被包装在 EjbException 中,并按预期捕获、处理和重新抛出,直到它到达 ClassOne 的 catch 块。但是,当我使 ClassThree 无状态(使用@Stateless)时,所捕获的 RuntimeException 变成了 EjbTransactionRolledBackException 导致事务回滚,并且 ClassOne 中任何尝试调用持久服务的处理都因此而崩溃。我尝试使用 @TransactionAttributes 进行试验:
SUPPORTS, REQUIRED -> 给出相同的 RollBack 行为来终止事务
NOT_SUPPORTED -> 甚至在条件检查之前,在 JpaRepository 调用上给出一个 TransactionRequiredException (我假设应该有一个带有原始非注释类的 TransactionType 。并且可能与 ClassTwo 中的 Transaction 不同 - 由于第1点。)
REQUIRES_NEW -> 似乎与原始代码的行为相同。
我的印象是,如果没有明确说明,那么调用的方法/类将使用默认类型 REQUIRED(显然不是这种情况,因为如第 1 点所述)。那么 TransactionType 在 Annotated(EJB)-NonAnnotated(CDI) bean 之间是如何工作的呢?它与两个 Annotated(EJB) bean 之间的工作方式不同吗?我不确定我的问题是否清楚。简而言之,整个 Transaction 行为令人困惑,特别是因为 ClassThree 在使其成为无状态之前和之后的行为方式不同。
对此的任何输入或对更多信息的参考都会非常有帮助。提前致谢