0

StateMachineConfigurerAdapter で定義されたカスタム アクションから例外をスローすると、それ以降のステート マシンへの呼び出しは null currentState を取得するため、NPE をスローします。

ステートマシンへの私の呼び出しは次のとおりです。

PersistStateMachineHandler handler;    
handler.handleEventWithState(
                        MessageBuilder
                                .withPayload(event)
                                .setHeader("key", data)
                                .build()
                        ,
                        previousState
                )

スタックトレースは次のとおりです。

java.lang.NullPointerException
    at org.springframework.statemachine.support.AbstractStateMachine.acceptEvent(AbstractStateMachine.java:591)
    at org.springframework.statemachine.support.AbstractStateMachine.sendEvent(AbstractStateMachine.java:202)
    at org.springframework.statemachine.recipes.persist.PersistStateMachineHandler.handleEventWithState(PersistStateMachineHandler.java:81)

その理由は、currentState が null になるため、this.currentState.getIds() が NPE をスローしているためです。

AbstractStateMachine にコードの問題があるようです

protected synchronized boolean acceptEvent(Message<E> message)

前の行はすべて currentState != null 条件を処理しているため、最後の行は処理していません。通常は不要な currentState を明示的に渡すことで、この例外をスキップできます。しかし、 currentState を与えた後でも、persistStateChangeListener の onPersist() メソッドを呼び出していない場合

4

1 に答える 1

1

void execute(StateContext<S, E> context);1 つの解決策は、org.springframework.statemachine.action.Action<S, E>インターフェイスで提供されるコンテキストを使用することです。

コンテキストを取得したら、次の方法で StateMachine にアクセスできます。StateMachine<S, E> getStateMachine();

セット内StateMachineの例外void setStateMachineError(Exception exception);

例えば

context.getStateMachine().setStateMachineError(new IllegalArgumentException("Ooops");

于 2017-01-13T16:47:15.240 に答える