Closed Dreaming9420 closed 3 months ago
今天我也碰到了这个问题,你这里doAction其实是用来注册action的,加上事务其实说不通。本质应该是调用了是action里的execute方法, 因此我的解决方法是将这个内部类注册成bean,同时在重写的execute上声明事务
我是这篇文章的作者,这其实并非是框架的问题,而是早期在实践状态机过程中的错误用法,正确用法如上面的回答提及的 你应该直接传递实现了Action的Bean,而不需要再通过Service类+匿名内部类的方式进行状态机定义
@Resource
@Qualifier("actionTest")
private Action<AuditState, AuditEvent, AuditContext> actionTest;
StateMachineBuilder<AuditState, AuditEvent, AuditContext> builder = StateMachineBuilderFactory.create();
builder.externalTransition().from(AuditState.APPLY).to(AuditState.DAD_PASS)
.on(AuditEvent.PASS)
.perform(actionTest);
对应的ActionTest为
@Component
public class ActionTest implements Action<AuditState, AuditEvent, AuditContext> {
@Override
@Transactional
public void execute(AuditState from, AuditState to, AuditEvent event, AuditContext context) {
}
}
这样事务将会起作用,晚些时候我将勘误这篇文章
今天我也碰到了这个问题,你这里doAction其实是用来注册action的,加上事务其实说不通。本质应该是调用了是action里的execute方法, 因此我的解决方法是将这个内部类注册成bean,同时在重写的execute上声明事务
明白了,谢谢
我是这篇文章的作者,这其实并非是框架的问题,而是早期在实践状态机过程中的错误用法,正确用法如上面的回答提及的 你应该直接传递实现了Action的Bean,而不需要再通过Service类+匿名内部类的方式进行状态机定义
@Resource @Qualifier("actionTest") private Action<AuditState, AuditEvent, AuditContext> actionTest; StateMachineBuilder<AuditState, AuditEvent, AuditContext> builder = StateMachineBuilderFactory.create(); builder.externalTransition().from(AuditState.APPLY).to(AuditState.DAD_PASS) .on(AuditEvent.PASS) .perform(actionTest);
对应的ActionTest为
@Component public class ActionTest implements Action<AuditState, AuditEvent, AuditContext> { @Override @Transactional public void execute(AuditState from, AuditState to, AuditEvent event, AuditContext context) { } }
这样事务将会起作用,晚些时候我将勘误这篇文章
好的,谢谢
5.x-SNAPSHOT版本 给.perform(orderActionTest.doAction())里的doAction方法加@Transactional没用,框架内部产生了自调用问题,导致事务失效 https://juejin.cn/post/7234059110236700730