在使用springboot+activiti的serviceTask过程中,通过activiti:delegateExpression的代理方式注入bean,如${serviceTaskService}的时候,在实现@Service注解而没有指定注解值的时候将会出现以下异常
org.activiti.engine.ActivitiException: Unknown property used in expression: ${serviceTaskService} at org.activiti.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior.execute(ServiceTaskDelegateExpressionActivityBehavior.java:119) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.agenda.ContinueProcessOperation.executeActivityBehavior(ContinueProcessOperation.java:180) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.agenda.ContinueProcessOperation.executeSynchronous(ContinueProcessOperation.java:131) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.agenda.ContinueProcessOperation.continueThroughFlowNode(ContinueProcessOperation.java:89) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.agenda.ContinueProcessOperation.run(ContinueProcessOperation.java:55) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:73) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:57) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:42) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:48) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:63) ~[activiti-engine-6.0.0.jar:6.0.0] at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47) [activiti-spring-6.0.0.jar:6.0.0] at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) [spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE] at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45) [activiti-spring-6.0.0.jar:6.0.0] at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:29) [activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:44) [activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:39) [activiti-engine-6.0.0.jar:6.0.0] at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceByKey(RuntimeServiceImpl.java:82) [activiti-engine-6.0.0.jar:6.0.0] at com.activiti.service.impl.OverTimerServiceImpl.startWorkFlow(OverTimerServiceImpl.java:29) [classes/:na]
刚开始的时候一直没有找到问题的原因,通过慢慢摸索原来只需要把注解@Servcie修改为@Service(value="serviceTaskService")即给该注解添加值就可以了,这是一个相当郁闷的事情,因为spring通常会自动的按照接口类来默认给注解取值,但是在activiti的serviceTask通过代理的时候就出问题了,这可能跟activiti的代码实现由关,没有实现初始缓存的原因,所以调用的时候就出问题了。下面贴下代码
serviceTest.bpmn20.xml:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://activiti.org/test"> <process id="serviceTest" name="serviceTest" isExecutable="true"> <endEvent id="end" name="end"/> <sequenceFlow sourceRef="start" targetRef="task1" id="start-task1"/> <sequenceFlow sourceRef="task1" targetRef="task2" id="task1-task2"/> <sequenceFlow sourceRef="task2" targetRef="end" id="task2-end"/> <serviceTask id="task1" name="任务1" activiti:delegateExpression="${serviceTaskService}"/> <serviceTask id="task2" name="任务2" activiti:delegateExpression="${serviceTaskService}"/> <startEvent id="start" name="start"/> </process> <bpmndi:BPMNDiagram> <bpmndi:BPMNPlane> <bpmndi:BPMNShape bpmnElement="start"> <omgdc:Bounds height="48.0" width="51.0" x="-12.0" y="-4.0"/> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="task1"> <omgdc:Bounds height="64.0" width="84.0" x="159.0" y="-10.0"/> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="end"> <omgdc:Bounds height="51.0" width="56.0" x="450.0" y="3.0"/> </bpmndi:BPMNShape> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> <bpmndi:BPMNDiagram> <bpmndi:BPMNPlane> <bpmndi:BPMNShape bpmnElement="task2"> <omgdc:Bounds height="71.0" width="83.0" x="427.0" y="55.0"/> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="end"> <omgdc:Bounds height="48.0" width="48.0" x="660.0" y="68.0"/> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="task1"> <omgdc:Bounds height="48.0" width="120.0" x="210.0" y="65.0"/> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="start"> <omgdc:Bounds height="48.0" width="48.0" x="39.0" y="61.0"/> </bpmndi:BPMNShape> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
ServiceTaskService接口:
import org.activiti.engine.delegate.JavaDelegate; /** * @version 1.0 * @date 2018/7/12 * @description */ public interface ServiceTaskService extends JavaDelegate { }
ServiceTaskServiceImpl实现类:
import com.activiti.service.ServiceTaskService; import org.activiti.engine.delegate.DelegateExecution; import org.springframework.stereotype.Service; /** * @version 1.0 * @date 2018/7/12 * @description */ @Service(value = "serviceTaskService") public class ServiceTaskServiceImpl implements ServiceTaskService { @Override public void execute(DelegateExecution delegateExecution) { System.out.println("当前节点:" + delegateExecution.getCurrentFlowElement().getName()); } }
controller启动类:
package com.activiti.service.impl; import org.activiti.engine.RuntimeService; import org.activiti.engine.runtime.ProcessInstance; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; import javax.annotation.Resource; import java.util.Optional; /** * @version 1.0 * @date 2018/7/10 * @description */ @RestController public class ServiceTaskController { @Resource private RuntimeService runtimeService; @Transactional(rollbackFor = Exception.class) @GetMapping(value = "/startWorkflow") public boolean startWorkflow(@RequestParam(value = "workFlowName")String workFlowName) { // 通过流程定义的key启动,选取最高的version启动 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(workFlowName); if (Optional.ofNullable(processInstance).isPresent() && processInstance.getProcessInstanceId().length() > 0) { return true; } return false; } }
maven配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>test_springboot_activiti</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.14.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> </dependency> <!--<dependency> <groupId>org.activiti</groupId> <artifactId>activiti5-engine</artifactId> <version>6.0.0</version> </dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--HikariCP数据连接池 --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
更多例子可以参考https://github.com/422518490/test_springboot_activiti
相关推荐
7. **服务调用与业务逻辑**: 通过`ServiceTask`元素,Activiti可以与Spring的服务层交互,实现业务逻辑。在SpringBoot环境中,这些服务通常是通过注解驱动的,例如`@Autowired`和`@Service`。 8. **日志与监控**: ...
标题中的“springboot+activiti+vue+thymleaf 版本”指的是一个基于Spring Boot、Activiti、Vue.js和Thymeleaf的综合工作流管理系统。这个系统结合了四个关键的技术栈,构建了一个功能丰富的业务流程自动化平台。 1...
【标题】:“idea +springboot + activiti 请假实例源码” 这个项目是基于IntelliJ IDEA(IntelliJ IDEA简称Idea,是一款流行的Java开发IDE)、Spring Boot和Activiti的工作流程管理系统的简单实例,主要展示了如何在...
首先,让我们从标题"springboot+activiti7 入门小demo"开始,这个标题暗示了这是一个基于Spring Boot的小型项目,旨在帮助初学者理解如何集成和使用Activiti 7。Spring Boot以其"开箱即用"的特性,简化了Java应用的...
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 3. 岗位管理:配置系统用户所属担任职务。...集成activiti5.22
1.使用IDEA对springboot+activiti开发demo和详细讲解, 1.使用IDEA对springboot+activiti开发demo和详细讲解 1.使用IDEA对springboot+activiti开发demo和详细讲解 1.使用IDEA对springboot+activiti开发demo和详细...
基于Springboot +activiti实现的一个企业级OA管理系统(源码+数据库),项目经过测试,可完美运行!相关说明: ## 1. 库 > 1. SpringBoot Web库 > 2. Activiti 工作流库 > 3. freemarker 模板 > 4. rapid-core 扩展...
2. **ArtifactId**: 项目ID,例如`activiti-springboot-sample`。 3. **Version**: 使用Spring Boot的最新稳定版本,如`2.x.x.RELEASE`。 4. **Packaging**: 选择`jar`,生成可执行的JAR文件。 5. **Java Version**:...
Activiti7发布正式版之后,它与SpringBoot2.x已经完全支持整合开发。我们可以将Activiti7与SpringBoot整合开发的坐标引入到工程中,从而达到SpringBoot支持Activti7整合。 1.使用IDEA创建SpringBoot项目 在工程的...
使用IDEA对springboot+activiti开发demo和详细讲解;下载该资源可以先了解下具体文章https://blog.csdn.net/qq_28582847/article/details/79911450 还有...
基于 springboot+mybatis_+shiro + redis+activiti+quarts+quartz+vue 写的一个前后分离办公企业管理系统 ,通用服务端,用于学习。 使用技术 服务端: springboot(2.2.1) + mybatis-push + shiro(1.4.0) + redis +...
1. **创建测试类**:在项目中创建测试类,使用 `@Autowired` 注解注入 Activiti 相关服务,如 RepositoryService、RuntimeService 等。 2. **启动流程实例**:编写测试方法,启动流程实例,可以通过 `...
本项目"springboot+activiti部署插件集成"的目标是将这两个强大的工具结合在一起,使得开发者能够在Spring Boot应用中无缝地嵌入Activiti的工作流功能。下面将详细介绍这个集成过程中的关键知识点: 1. **Spring ...
《SpringBoot集成Activiti项目Demo源码解析》 在当今的软件开发中,工作流引擎已经成为企业级应用不可或缺的一部分,而Activiti作为一款强大的、开源的工作流引擎,被广泛应用于业务流程管理(BPM)系统。...
springboot整合activiti5.22实现页面流程设计项目,可直接启动,自动建表,调用接口http://localhost:8080/models/newModel,创建流程模型后,可直接访问http://localhost:8080/static/modeler.html?modelId=75001...
**SpringBoot整合Activiti完整DEMO详解** SpringBoot作为一个轻量级的Java开发框架,以其简洁的配置和快速的应用启动而受到广泛欢迎。而Activiti则是一个强大的工作流引擎,常用于实现业务流程自动化。本DEMO展示了...
《SpringBoot+Activiti+Bootstrap实现的办公自动化系统详解》 在现代企业信息化管理中,办公自动化系统(Office Automation System,简称OAS)扮演着至关重要的角色,它能够有效地提高工作效率,规范工作流程,实现...
《SpringBoot + Activiti 实现OA系统详解》 在当今的软件开发领域,SpringBoot以其简洁的配置和快速的启动特性,已经成为企业级应用开发的首选框架。而Activiti作为一款开源的工作流引擎,能够帮助开发者轻松实现...
基于 springboot+myvatis_+ mvc + activiti+quarts+quartz 写的一个办公企业管理系统 OA 软件架构 springboot+myvatis_+ mvc + activiti+quarts+quartz 说明 功能: 用户模块 日志模块 考勤模块 工作流模块 请假 ...
**SpringBoot+Activiti7 实现简单增删改查** 在现代企业级应用开发中,工作流管理系统(Workflow Management System)扮演着至关重要的角色。它能够帮助自动化业务流程,提高效率,减少人为错误。SpringBoot作为...