无法在我的 Spring webapp 中注入 Activiti 框架服务
failed to Inject Activiti framework services in my Spring webapp
我正在尝试使用 Activiti 和 Spring MVC 框架在我的 Web 应用程序中创建工作流,因此我必须通过 applicationContext.xml 文件注入 Activiti 服务,然后自动连接这些服务。
这是 JUnit 测试后控制台中的问题
GRAVE: Caught exception while allowing TestExecutionListener
[org.springframework.test.context.support.DependencyInjectionTestExecutionListener@14c8743]
to prepare test instance [tds_erp.testSpring@144719c]
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'tds_erp.testSpring': Injection of autowired
dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Could not
autowire field: org.activiti.engine.RepositoryService
tds_erp.testSpring.repositoryService; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
qualifying bean of type [org.activiti.engine.RepositoryService] found
for dependency: expected at least 1 bean which qualifies as autowire
candidate for this dependency. Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.BeanCreationException:
Could not autowire field: org.activiti.engine.RepositoryService
tds_erp.testSpring.repositoryService; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
qualifying bean of type [org.activiti.engine.RepositoryService] found
for dependency: expected at least 1 bean which qualifies as autowire
candidate for this dependency. Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
qualifying bean of type [org.activiti.engine.RepositoryService] found
for dependency: expected at least 1 bean which qualifies as autowire
candidate for this dependency. Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
applicatioContext.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());
}
}
请帮助我!
您似乎想在测试用例中使用 applicatioContext.xml
中定义的 bean,例如 repositoryService
等。但是你在 the @ContextConfiguration
中声明的只是 activiti 的默认配置文件 activiti.cfg.xml
您可以在测试中尝试以下操作吗:
@ContextConfiguration("classpath:applicatioContext.xml")
只是一个建议:为类似于 webapplicationContext 中的测试上下文创建一个单独的 applicatioContext.xml
可能是个好主意。这将有助于保留不同的数据等,您可以在其中比正常的开发数据库实例更好地管理 pre/post 数据条件。您甚至可能想为测试本身生成一个数据库实例并在测试后拆除。
编辑:
您可以像这样提供多个 conf 文件 - @ContextConfiguration(locations = { "classpath:applicatioContext.xml" , "classpath*:activiti.cfg.xml"})
。检查这个 post.
通常定义“<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
”应该在内部加载 activiti.cfg.xml
,除非您更改了它的默认位置。
我正在尝试使用 Activiti 和 Spring MVC 框架在我的 Web 应用程序中创建工作流,因此我必须通过 applicationContext.xml 文件注入 Activiti 服务,然后自动连接这些服务。
这是 JUnit 测试后控制台中的问题
GRAVE: Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@14c8743] to prepare test instance [tds_erp.testSpring@144719c] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tds_erp.testSpring': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.activiti.engine.RepositoryService tds_erp.testSpring.repositoryService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.activiti.engine.RepositoryService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.activiti.engine.RepositoryService tds_erp.testSpring.repositoryService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.activiti.engine.RepositoryService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.activiti.engine.RepositoryService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
applicatioContext.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());
}
}
请帮助我!
您似乎想在测试用例中使用 applicatioContext.xml
中定义的 bean,例如 repositoryService
等。但是你在 the @ContextConfiguration
中声明的只是 activiti 的默认配置文件 activiti.cfg.xml
您可以在测试中尝试以下操作吗:
@ContextConfiguration("classpath:applicatioContext.xml")
只是一个建议:为类似于 webapplicationContext 中的测试上下文创建一个单独的 applicatioContext.xml
可能是个好主意。这将有助于保留不同的数据等,您可以在其中比正常的开发数据库实例更好地管理 pre/post 数据条件。您甚至可能想为测试本身生成一个数据库实例并在测试后拆除。
编辑:
您可以像这样提供多个 conf 文件 - @ContextConfiguration(locations = { "classpath:applicatioContext.xml" , "classpath*:activiti.cfg.xml"})
。检查这个 post.
通常定义“<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
”应该在内部加载 activiti.cfg.xml
,除非您更改了它的默认位置。