2017-07-25 3 views
0

J'essaie d'utiliser le framework Spring Statemachine dans mon projet, mais je rencontre une erreur de définition de bean de construction au moment de la compilation.buildBeanDefinition échoue avec Spring Statemachine Framework

2017-07-25 16:37:25.462:WARN:oejd.DeploymentManager:Scanner-1: Unable to reach node goal: started 
java.lang.NoSuchMethodError: org.springframework.beans.factory.support.RootBeanDefinition.setTargetType(Lorg/springframework/core/ResolvableType;)V 
    at org.springframework.statemachine.config.configuration.StateMachineConfiguration.buildBeanDefinition(StateMachineConfiguration.java:109) 
    at org.springframework.statemachine.config.common.annotation.AbstractImportingAnnotationConfiguration.registerBeanDefinitions(AbstractImportingAnnotationConfiguration.java:92) 
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:352) 
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:143) 
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:116) 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:333) 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98) 
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:678) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:520) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 

que je suis avec step 7 dans mon application Spring MVC. Je n'utilise pas SpringBoot, mais je ne pense pas qu'il me manque des sous-fichiers.

Voici mon code pour le fichier StateMachineConfig:

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.statemachine.config.EnableStateMachine; 
import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; 
import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; 
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; 
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; 
import org.springframework.statemachine.listener.StateMachineListener; 
import org.springframework.statemachine.listener.StateMachineListenerAdapter; 
import org.springframework.statemachine.state.State; 

import java.util.EnumSet; 


@Configuration 
@EnableStateMachine 
public class StateMachineConfig 
     extends EnumStateMachineConfigurerAdapter<States, Events> { 

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

    @Override 
    public void configure(StateMachineStateConfigurer<States, Events> states) 
      throws Exception { 
     states 
       .withStates() 
       .initial(States.SI) 
       .states(EnumSet.allOf(States.class)); 
    } 

    @Override 
    public void configure(StateMachineTransitionConfigurer<States, Events> transitions) 
      throws Exception { 
     transitions 
       .withExternal() 
       .source(States.SI).target(States.S1).event(Events.E1) 
       .and() 
       .withExternal() 
       .source(States.S1).target(States.S2).event(Events.E2); 
    } 

    @Bean 
    public StateMachineListener<States, Events> listener() { 
     return new StateMachineListenerAdapter<States, Events>() { 
      @Override 
      public void stateChanged(State<States, Events> from, State<States, Events> to) { 
       System.out.println("State change to " + to.getId()); 
      } 
     }; 
    } 
} 

C'est le contrôleur que je tente d'utiliser le StateMachine dans (Note: j'ai enlevé l'étiquette @Autowired au-dessus du instanciation du StateMachine comme IntelliJ a continué à dire « Aucun haricots de type « StateMachine » trouvé » Cela peut être le coupable de mes problèmes).?

@Controller 
@RequestMapping("/") 
public class HomeController { 

    private StateMachine<States, Events> stateMachine; 

    @RequestMapping(method = RequestMethod.GET) 
    public String index() { 
      stateMachine.sendEvent(Events.E1); 
      return "redirect:/target/list"; 
    } 
} 

Répondre

2

NoSuchMethodError si les points au printemps des classes de base signifient qu'il ya une mixup de versions cadres. Vous laissez probablement pom statemachine résoudre certaines versions et votre propre build ajoute quelque chose d'autre.

Votre fichier de construction maven ou gradle montre probablement pourquoi les jarres de framework de base ont des versions différentes. Si vous utilisez boot, vous obtiendrez des versions correctes, sans cela vous devrez gérer les versions manuellement.

+0

Cela a du sens. Existe-t-il un moyen de savoir quelles versions de jar j'ai besoin d'utiliser avec statemachine? Mon projet compilait et fonctionnait plus tôt, et j'ai simplement simplement ajouté le code ci-dessus à la base de code existante, ainsi que la dépendance spring-statemachine-core dans le fichier POM. – A21

+0

Merci, cela a aidé. J'ai mis à jour mes versions existantes de POM pour certains des frameworks de Spring Spring de 3.2.5.RELEASE à 4.2.3.RELEASE. – A21