2017-04-13 5 views
0

Ich stoße nur auf ein Problem bei der Verwendung von Spring State Machine @WithStateMachine.Spring State Machine Annotation @WithStateMachine funktioniert nicht

@WithStateMachine nur funktionieren, wenn ich es auf innere Klasse verwenden, die in der Klasse von @EnableStateMachine announced definiert, aber wenn ich Klasse an anderer Stelle definieren, scheint es nicht funktionieren. Hier ist mein Code:

@[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"); 
    } 
}} 

aber wenn ich Aktion in einem anderen Klassendatei definieren, ist es nicht

enter image description here

mein pom

 <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> 

Antwort

0

@WithStateMachine ein Meta- Arbeit ist Anmerkung mit Feder @Component. Überprüfen Sie, ob Ihre Klasse Action entweder manuell gescannt oder manuell als @Bean erstellt wurde.

Dann gibt es im Anwendungskontext und StateMachine kann es finden.

+0

Ich repariere es einfach, ich habe ''. Wenn bohnen lazy-init aktivieren ist, diesen Code '\t \t für (StateMachineHandler Handler: beanFactory.getBeansOfType (StateMachineHandler.class) .values ​​()) { \t \t \t Annotation Annotation = handler.getAnnotation(); \t \t \t Anmerkung 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) wird nicht wie erwartet verhalten. – TimGuan

+0

Ich habe nur Lazy-Init deaktivieren – TimGuan

Verwandte Themen