2016-06-07 4 views
0

StateMachineConfigurerAdapter에 정의 된 사용자 정의 액션에서 예외를 throw하면 상태 머신에 대한 모든 후속 호출이 null currentState를 가져올 때 NPE를 throw합니다.작업에서 예외를 throw 할 때 스프링 상태 머신이 NullPointerException을 throw합니다.

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() 메서드를 호출하지 않더라도

답변

1

인터페이스에서 void execute(StateContext<S, E> context);이 제공하는 컨텍스트를 사용하는 것이 하나의 방법입니다.

당신은 당신이 void setStateMachineError(Exception exception);

예에서 예외 설정 StateMachineStateMachine<S, E> getStateMachine();

를 통해 머신 (StateMachine)에 액세스 할 수있는 상황이되면

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