当您从操作

时间:2016-06-07 09:43:15

标签: java spring state-machine spring-statemachine

当我从StateMachineConfigurerAdapter中定义的自定义操作中抛出异常时,对状态机的任何后续调用都会抛出NPE,因为它获得null currentState。

我对状态机的调用是:

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)

原因是this.currentState.getIds()抛出NPE,因为currentState变为null。

似乎AbstractStateMachine

中存在一些代码问题
protected synchronized boolean acceptEvent(Message<E> message)

最后一行没有处理currentState!= null条件,因为前一个都处理它。您可以通过显式传递currentState来跳过此异常,这通常不是必需的。但即使在给出currentState之后,它也没有调用persistStateChangeListener的onPersist()方法

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用void execute(StateContext<S, E> context);界面中org.springframework.statemachine.action.Action<S, E>提供的上下文。

获得上下文后,您可以通过StateMachine<S, E> getStateMachine();

访问StateMachine StateMachine中的

void setStateMachineError(Exception exception);

中设置了例外

e.g。

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