Java buildBeanDefinition使用Spring状态机框架失败

Java buildBeanDefinition使用Spring状态机框架失败,java,spring,spring-statemachine,Java,Spring,Spring Statemachine,我试图在我的项目中使用Spring Statemachine框架,但是在编译时遇到了构建bean定义错误 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.setTarget

我试图在我的项目中使用Spring Statemachine框架,但是在编译时遇到了构建bean定义错误

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)
在我的SpringMVC应用程序中,我将跟随。我没有使用SpringBoot,但我认为我没有丢失任何子文件

以下是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());
            }
        };
    }
}
import org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.statemachine.config.EnableStateMachine;
导入org.springframework.statemachine.config.EnumStateMachineConfigureAdapter;
导入org.springframework.statemachine.config.builders.stateMachineConfiguration配置器;
导入org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
导入org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
导入org.springframework.statemachine.listener.StateMachineListener;
导入org.springframework.statemachine.listener.StateMachineListenerAdapter;
导入org.springframework.statemachine.state.state;
导入java.util.EnumSet;
@配置
@使能状态机
公共类StateMachineConfig
扩展EnumStateMachineConfigureAdapter{
@凌驾
公共无效配置(StateMachineConfiguration配置器配置)
抛出异常{
配置
.withConfiguration()
.AutoStart(真)
.listener(listener());
}
@凌驾
公共无效配置(StateMachineStateConfigurer状态)
抛出异常{
州
.with states()
.首字母(States.SI)
.states(EnumSet.allOf(states.class));
}
@凌驾
公共无效配置(StateMachineTransitionConfigurer转换)
抛出异常{
过渡
.withExternal()
.source(States.SI).target(States.S1).事件(Events.E1)
.及()
.withExternal()
.source(States.S1)、target(States.S2)、Events(Events.E2);
}
@豆子
公共状态机侦听器(){
返回新的StateMachineListenerAdapter(){
@凌驾
公共无效状态已更改(状态从、状态到){
System.out.println(“状态更改为”+to.getId());
}
};
}
}
这就是我试图在其中使用StateMachine的控制器(注意:我删除了StateMachine实例化上方的@Autowired标记,因为intelliJ一直在说“找不到'StateMachine'类型的bean”。这可能是我的问题的罪魁祸首?)

@控制器
@请求映射(“/”)
公共类家庭控制器{
私有状态机;
@RequestMapping(method=RequestMethod.GET)
公共字符串索引(){
sendEvent(Events.E1);
返回“重定向:/target/list”;
}
}

NoSuchMethodError
如果指向spring核心类,则表示存在框架版本的混合。您可能正在让statemachine pom解析某些版本,而您自己的构建添加了其他内容


您的maven或gradle构建文件可能显示了核心框架JAR具有不同版本的原因。如果使用boot,那么您几乎可以获得正确的版本,没有它,您需要手动管理版本。

NoSuchMethodError如果指向spring核心类意味着存在框架版本的混合。您可能正在让statemachine pom解析某些版本,而您自己的构建添加了其他内容


您的maven或gradle构建文件可能显示了核心框架JAR具有不同版本的原因。如果使用boot,那么您几乎可以获得正确的版本,没有它,您需要手动管理版本。

这很有意义。有没有办法知道我需要在statemachine中使用哪些jar版本?我的项目之前已经编译并运行了,我只是在现有的代码库中添加了上面的代码,以及POM文件中的spring statemachine核心依赖项。谢谢,这很有帮助。我将一些核心spring框架的现有POM版本从3.2.5.RELEASE升级到4.2.3.RELEASE,这很有意义。有没有办法知道我需要在statemachine中使用哪些jar版本?我的项目之前已经编译并运行了,我只是在现有的代码库中添加了上面的代码,以及POM文件中的spring statemachine核心依赖项。谢谢,这很有帮助。我将一些核心spring框架的现有POM版本从3.2.5.RELEASE升级到4.2.3.RELEASE。
@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";
    }
}