2017-04-13 3 views
0

스프링 스테이트 머신 @WithStateMachine을 사용할 때 문제가 발생했습니다.스프링 상태 머신 주석 @WithStateMachine이 작동하지 않습니다.

@WithStateMachine은 @EnableStateMachine에 의해 주석이 달린 클래스에서 정의 된 내부 클래스에서 사용할 때만 작동하지만 다른 클래스에서 클래스를 정의하면 작동하지 않는 것처럼 보입니다. 다음은 내 코드입니다 :

@[email protected] public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> { 
@Override 
public void configure(StateMachineStateConfigurer<States, Events> states) 
    throws Exception { 
    states 
     .withStates() 
     .initial(States.UNPAID) 
     .states(EnumSet.allOf(States.class)); 
} 

@Override 
public void configure(StateMachineTransitionConfigurer<States, Events> transitions) 
    throws Exception { 
    transitions 
     .withExternal() 
     .source(States.UNPAID).target(States.WAITING_FOR_RECEIVE) 
     .event(Events.PAY) 
     .and() 
     .withExternal() 
     .source(States.WAITING_FOR_RECEIVE).target(States.DONE) 
     .event(Events.RECEIVE); 
} 

@Override 
public void configure(StateMachineConfigurationConfigurer<States, Events> config) 
    throws Exception { 
    config 
     .withConfiguration() 
     .autoStartup(true); 
} 

@WithStateMachine 
public class Action { 
    private Logger logger = LoggerFactory.getLogger(getClass()); 

    @OnTransition(target = "UNPAID") 
    public void create() { 
     logger.info("UNPAID"); 
    } 

    @OnTransition(source = "UNPAID", target = "WAITING_FOR_RECEIVE") 
    public void pay() { 
     logger.info("WAITING_FOR_RECEIVE"); 
    } 

    @OnTransition(source = "WAITING_FOR_RECEIVE", target = "DONE") 
    public void receive() { 
     logger.info("DONE"); 
    } 
}} 

하지만 난 다른 클래스 파일에서 작업을 정의 할 때,

enter image description here

내 치어가

 <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-messaging</artifactId> 
      <version>1.2.3.RELEASE</version> 
     </dependency><dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>4.3.3.RELEASE</version> 
     </dependency> 

답변

0

@WithStateMachine는 메타입니다 작동하지 않을 수있다 주석이있는 봄 @Component. Action 클래스가 구성 요소로 스캔되었거나 수동으로 생성되었는지 확인하십시오 (@Bean).

그런 다음 애플리케이션 컨텍스트에 존재하며 statemachine은이를 찾을 수 있습니다.

+0

나는 그것을 고치기 위해 ''를 사용했다. 콩 - 게으른 초기화는,이 코드 (StateMachineHandler 핸들러 <주석, S, E 확장?> : beanFactory.getBeansOfType (StateMachineHandler.class) .values ​​())에 대한 '\t \t 가능하다 { \t \t \t 주석 주석 = handler.getAnnotation(); \t \t \t 주석 metaAnnotation = handler.getMetaAnnotation(); \t \t \t WithStateMachine withStateMachine = AnnotationUtils.findAnnotation (handler.getBeanClass() \t \t \t \t \t WithStateMachine.class); '(org.springframework.statemachine.processor.StateMachineHandlerCallHelper 83)은 예상대로 작동하지 않습니다. – TimGuan

+0

나는 단지 lazy-init를 비활성화했다. – TimGuan