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

我对状态机的呼叫是:

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


stacktrace是:

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()方法

最佳答案

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

一旦有了上下文,就可以通过StateMachine<S, E> getStateMachine();访问StateMachine

StateMachine中设置void setStateMachineError(Exception exception);中的例外

例如

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

关于java - 当您从操作中引发异常时,Spring状态机将引发NullPointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37675808/

10-09 06:25
查看更多