Java 未能在我的Spring webapp中注入Activiti framework服务

Java 未能在我的Spring webapp中注入Activiti framework服务,java,spring,spring-mvc,dependency-injection,activiti,Java,Spring,Spring Mvc,Dependency Injection,Activiti,我正在尝试使用Activiti和SpringMVC框架在我的web应用程序中创建工作流,因此我必须通过applicationContext.xml文件注入Activiti服务,然后自动连接这些服务 这就是控制台在JUnit测试后出现的问题 严重:允许TestExecutionListener时捕获异常 [org.springframework.test.context.support]。DependencyInjectionTestExecutionListener@14c8743] 准备测试实

我正在尝试使用Activiti和SpringMVC框架在我的web应用程序中创建工作流,因此我必须通过applicationContext.xml文件注入Activiti服务,然后自动连接这些服务

这就是控制台在JUnit测试后出现的问题

严重:允许TestExecutionListener时捕获异常 [org.springframework.test.context.support]。DependencyInjectionTestExecutionListener@14c8743] 准备测试实例[tds_erp]。testSpring@144719c] org.springframework.beans.factory.BeanCreationException:错误 创建名为“tds_erp.testSpring”的bean:自动连线的注入 依赖关系失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法 autowire字段:org.activiti.engine.RepositoryService tds_erp.testSpring.repositoryService;嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 找到类型为[org.activiti.engine.RepositoryService]的合格bean 对于依赖项:至少需要1个符合autowire条件的bean 此依赖项的候选项。依赖项批注: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

原因:org.springframework.beans.factory.BeanCreationException: 无法自动连线字段:org.activiti.engine.RepositoryService tds_erp.testSpring.repositoryService;嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 找到类型为[org.activiti.engine.RepositoryService]的合格bean 对于依赖项:至少需要1个符合autowire条件的bean 此依赖项的候选项。依赖项批注: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

原因: org.springframework.beans.factory.noSuchBean定义异常:否 找到类型为[org.activiti.engine.RepositoryService]的合格bean 对于依赖项:至少需要1个符合autowire条件的bean 此依赖项的候选项。依赖项批注: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        ">


    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
        <property name="targetDataSource">
            <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
                <property name="driverClassName" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/activiti" />
                <property name="username" value="root" />
                <property name="password" value="admin" />
            </bean>
        </property>
    </bean>
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="databaseType" value="h2" />
        <property name="dataSource" ref="dataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="databaseSchemaUpdate" value="true" />
        <property name="deploymentResources"
            value="classpath*:chapter4/bookorder.spring.bpmn20.xml" />
        <property name="jobExecutorActivate" value="false" />
    </bean>
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>
    <bean id="repositoryService" factory-bean="processEngine"
        factory-method="getRepositoryService" />
    <bean id="runtimeService" factory-bean="processEngine"
        factory-method="getRuntimeService" />
    <bean id="taskService" factory-bean="processEngine"
        factory-method="getTaskService" />
    <bean id="historyService" factory-bean="processEngine"
        factory-method="getHistoryService" />
    <bean id="managementService" factory-bean="processEngine"
        factory-method="getManagementService" />
</beans>

JUnit测试文件:

import static org.junit.Assert.assertEquals;

import java.util.HashMap;
import java.util.Map;

import org.activiti.bpmn.model.Task;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:applicatioContext.xml")

public class testSpring {

    @Autowired(required=true)
     RepositoryService repositoryService;
    @Autowired(required=true)
     RuntimeService runtimeService;
    @Autowired(required=true)
     TaskService taskService;


    @Test
    public void simpleSpringTest() {

    Map<String, Object> variableMap =
    new HashMap<String, Object>();
    variableMap.put("object", "Activiti in Action");
    variableMap.put("description", "123456");
    runtimeService.startProcessInstanceByKey(
    "employeeRequest", variableMap);

    Task task = (Task) taskService
    .createTaskQuery().taskAssignee("kermit")
    .singleResult();
    assertEquals("Complete order", task.getName());
    taskService.complete(task.getId());
    assertEquals(0, runtimeService.
    createProcessInstanceQuery().count());
    }
    }
导入静态org.junit.Assert.assertEquals;
导入java.util.HashMap;
导入java.util.Map;
导入org.activiti.bpmn.model.Task;
导入org.activiti.engine.FormService;
导入org.activiti.engine.HistoryService;
导入org.activiti.engine.IdentityService;
导入org.activiti.engine.ManagementService;
导入org.activiti.engine.ProcessEngine;
导入org.activiti.engine.ProcessEngineConfiguration;
导入org.activiti.engine.RepositoryService;
导入org.activiti.engine.RuntimeService;
导入org.activiti.engine.TaskService;
导入org.activiti.spring.ProcessEngineFactoryBean;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.test.context.ContextConfiguration;
导入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(“classpath*:applicationContext.xml”)
公共类testSpring{
@自动连线(必需=真)
RepositoryService RepositoryService;
@自动连线(必需=真)
RuntimeService RuntimeService;
@自动连线(必需=真)
任务服务任务服务;
@试验
public void simpleSpringTest(){
映射变量映射=
新的HashMap();
variableMap.put(“对象”、“活动中”);
变量映射put(“描述”、“123456”);
runtimeService.startProcessInstanceByKey(
“员工需求”,变量图);
任务=(任务)任务服务
.createTaskQuery().taskAssignee(“kermit”)
.singleResult();
assertEquals(“完成订单”,task.getName());
taskService.complete(task.getId());
assertEquals(0,运行时服务)。
createProcessInstanceQuery().count());
}
}

请帮帮我

看起来您希望在测试用例中使用
applicationcontext.xml
中定义的bean,如
repositoryService
等。但是您在@ContextConfiguration中声明的只是activiti的默认配置文件
activiti.cfg.xml
您能在测试中尝试以下方法吗:

@ContextConfiguration("classpath:applicatioContext.xml")
只是一个建议:为测试上下文创建一个单独的
applicationcontext.xml
,与webapplicationContext中的上下文类似,这可能是一个好主意。这将有助于保留不同的数据等,这样您可以比正常的开发数据库实例更好地管理数据的前/后条件。您甚至可能希望为测试本身生成一个DB实例,并在测试后拆除

编辑: 您可以像这样提供多个conf文件-
@ContextConfiguration(locations={“classpath:applicationcontext.xml”,“classpath*:activiti.cfg.xml”})
。看看这个


通常定义“
”应该在内部加载
activiti.cfg.xml
,除非您更改了它的默认位置。

答案是thanx,但我有两个配置文件,
applicationContext.xml
activiti.cfg.xml
,我尝试了它们,但同样的问题我尝试了您的建议,但是我不知道在与applicationContext分离后如何调用activiti配置。它说没有定义bean谢谢你的回答,它通过将这一行
放在Activiti配置的第一个位置来解决,因此我理解ProcessEngine应该作为第一个加载,顺序很重要我很高兴它工作了。据我所知,bean定义的顺序应该无关紧要。我认为是其他原因造成了这个问题。但我不能说什么