Spring Statemachine:无法对选择状态转换执行操作?

Spring Statemachine: Action on choice state transition not possible?

添加到选择伪状态的动作似乎被默默地忽略了。这样做:

Builder builder = StateMachineBuilder.builder();
StateConfigurer states = builder.configureStates().withStates();
StateMachineTransitionConfigurer transitions = builder.configureTransitions();
StateConfigurer statesConfig = states.initial(INITIAL).states(EnumSet.allOf(StateType.class));
statesConfig.choice(StateType.CHOICE_STATE);

transitions.withChoice().source(StateType.CHOICE_STATE). //
    first(StateType.S1, someGuard). //
    last(StateType.S2);

states.state(StateType.CHOICE_STATE, someAction, null);

导致在输入 CHOICE_STATE 时永远不会执行 someAction。

框架不允许向 CHOICE_STATE 之外的转换添加操作(例如,到上面的 S1 或 S2)。

为了解决这个问题,我们在 CHOICE_STATE 之前实现了一个状态。然后我们可以像往常一样自由地向这个状态添加动作。我只是想知道这种限制的原因是什么,或者是否有某种方法可以将操作置于我可能错过的伪状态。

那是因为选择是一个 pseudostate,它应该是暂时的,所以在该状态本身不应该有行为改变。

您是否尝试过使用 Transition 来定义 Action,这会让您进入选择状态?

@Override
public void configure(StateMachineTransitionConfigurer<TestStates, TestEvents> transitions) throws Exception {
  transitions
    .withExternal()
      .source(TestStates.S1)
      .target(TestStates.S2)
      .event(TestEvents.E2)
      .action(externalTestAction());
}


@Bean
public Action<TestStates, TestEvents> externalTestAction() {
  return new TestAction();
}

前置状态是一个很好的解决方法,尤其是伴随着无触发转换的状态

我可以尝试看看在 Spring Statemachine 中我们是否可以将功能添加到转换(选择转换的配置器)本身。我为此 https://github.com/spring-projects/spring-statemachine/issues/108.

创建了一张票

虽然我们主要尝试遵循 UML 模型,但规范的大部分内容都非常模糊,并且将许多实现细节留给实现本身。