代码之家  ›  专栏  ›  技术社区  ›  Marc

Spring状态机:如何获得选择状态的转换?

  •  1
  • Marc  · 技术社区  · 9 年前

    我这样配置状态机:

        StateMachineTransitionConfigurer transitions = builder.configureTransitions();
        transitions.withChoice().source(CHOICE). //
        first(A, aGuard). //
        then(B, bGuard). //
        last(C);
    

    然后,在另一个地方,我想从这个配置获得选择转换。而我可以很容易地通过以下操作获得选择状态:

        for (final State smState : stateMachine.getStates()) {
            if (smState.getPseudoState() != null && smState.getPseudoState().getKind() == PseudoStateKind.CHOICE) {
    // smState is a choice state
            }
        }
    

    我不知道如何从这些选择状态(上面的“first”、“then”和“last”)获得转换列表。

    似乎无法访问此信息。我说得对吗?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Janne Valkealahti    9 年前

    状态机具有:

    Collection<Transition<S,E>> getTransitions()
    

    和来自 Transition 你需要检查源或目标

    State<S,E> getSource();
    State<S,E> getTarget()
    
        2
  •  0
  •   Marc    9 年前

    我们最终通过反思ChoicePseudoState的“选择”属性解决了这个问题,因为某些原因,ChoicePsudoState没有访问器:

        final Field choicesField = ChoicePseudoState.class.getDeclaredField("choices");
        choicesField.setAccessible(true);
    
        for (final State<SessionStateType, SessionEvent> smState : stateMachine.getStates()) {
            if (smState.getPseudoState() != null && smState.getPseudoState().getKind() == PseudoStateKind.CHOICE) {
                final ChoicePseudoState<SessionStateType, SessionEvent> choice = ((ChoicePseudoState<SessionStateType, SessionEvent>) smState
                    .getPseudoState());
                final List<ChoiceStateData<SessionStateType, SessionEvent>> choices = (List<ChoiceStateData<SessionStateType, SessionEvent>>) choicesField
                    .get(choice);
    
    ...