写在前面

需要提前了解的内容有 springboot、springSecurity、activiti基本使用

关于activiti

Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。

activiti主要应用场景

需要动态地改变流程的业务流程场景。例如请假流程、项目审批流程等。

正题

第一步:

新建一个springboot项目,引入activiti-spring-boot-starter和你所使用的数据库驱动器。本文采用Mysql 8.

读者也可以直接复制下面的pom文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>pers.lbf</groupId>
<artifactId>springboot-activiti</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-activiti</name>
<description>Demo project for Spring Boot</description> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency> <dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency> <dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.0.0.Beta2</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

第二步,修改application.yml配置文件

spring:
datasource:
url: jdbc:mysql://127.0.0.1:/你的数据库?userSSL=false&serverTimezone=GMT%2B8
username: root
password: 你的密码
driver-class-name: com.mysql.cj.jdbc.Driver
  activiti: database-schema-update: true
    db-history-used: true
history-level: audit

第三步,添加springSecurity的相关配置。

因为activiti7与springboot整合之后,默认情况下集成了springSecurity框架,所以我们需要配置一下springSecurity。本文的核心不在springSecurity,所以这一步将通过添加一个工具类的方式来完成。

 package pers.lbf.springbootactiviti.utils;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component; import javax.security.auth.Subject;
import javax.vecmath.Tuple2d;
import java.util.Collection; /**
* @author 赖柄沣 bingfengdev@aliyun.com
* @date 2020-08-18 11:27:31
* @version 1.0
*/
@Component
public class SecurityUtil { @Autowired
private UserDetailsService userDetailsService; public void logInAs(String username) { UserDetails user = userDetailsService.loadUserByUsername(username);
if (user == null) {
throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user");
} Authentication authentication = new Authentication() { @Override
public String getName() { return user.getUsername();
} @Override
public boolean implies(Subject subject) {
return false;
} @Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.getAuthorities();
} @Override
public Object getCredentials()
{
return user.getPassword();
} @Override
public Object getDetails() { return user;
} @Override
public Object getPrincipal() { return user;
} @Override
public boolean isAuthenticated() {
return true;
} @Override
public void setAuthenticated(boolean b) throws IllegalArgumentException { }
}; SecurityContextImpl securityContext = new SecurityContextImpl();
securityContext.setAuthentication(authentication);
SecurityContextHolder.setContext(securityContext);
org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);
}
}

第四步,添加权限配置信息。

正常项目中,权限信息存储于数据库当中。本文为了陈述方便,直接将权限信息定义在配置类当中。

package pers.lbf.springbootactiviti.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager; import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; /**
* @author 赖柄沣 bingfengdev@aliyun.com
* @version 1.0
* @date 2020/8/18 11:40
*/
@Configuration
public class ApplicationConfig { @Bean
public UserDetailsService getUserDetailsService(){ InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager(); String[][] usersGroupsAndRoles = {
{"salaboy", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
{"ryandawsonuk", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
{"erdemedeiros", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
{"other", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"},
{"system", "password", "ROLE_ACTIVITI_USER"},
{"admin", "password", "ROLE_ACTIVITI_ADMIN"}
}; for (String[] user : usersGroupsAndRoles) {
List<String> authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user,2,user.length)); userDetailsManager.createUser(new User(
user[0],
passwordEncoder().encode(user[1]),
authoritiesStrings.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList())
)
); } return userDetailsManager;
} @Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}

第五步,整合Junit,验证是否整合成功

首先,添加Junit依赖

        <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>

编写测试类

 package pers.lbf.springbootactiviti.activititest;

 import org.activiti.api.process.model.ProcessDefinition;
import org.activiti.api.process.model.builders.ProcessPayloadBuilder;
import org.activiti.api.process.model.payloads.StartProcessPayload;
import org.activiti.api.process.runtime.ProcessRuntime;
import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder;
import org.activiti.api.task.model.builders.CompleteTaskPayloadBuilder;
import org.activiti.api.task.runtime.TaskRuntime;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import pers.lbf.springbootactiviti.utils.SecurityUtil; import java.util.List; /**
* @author 赖柄沣 bingfengdev@aliyun.com
* @version 1.0
* @date 2020/8/18 12:10
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class Activiti7SpringbootTest { @Autowired
private ProcessRuntime processRuntime;
@Autowired
private TaskRuntime taskRuntime; @Autowired
private SecurityUtil securityUtil; @Autowired
private ProcessEngine processEngine; @Before
public void init() {
//认证
securityUtil.logInAs("system");
} /**部署流程
      说明:关于流程的部署,activiti7与springboot整合后,会自动部署已经创建好的流程文件(bpmn、png)
      只要将流程定义文件存放在"resources/processes/下即可"
* @author 赖柄沣 bingfengdev@aliyun.com
* @date 2020-08-18 12:53:51
* @version 1.0
*/
@Test
public void repositoryProcess(){
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("holiday.bpmn")
.name("请假流程")
.deploy();
System.out.println(deployment.getName());
System.out.println(deployment.getDeploymentTime());
} /**分页查询系统中所有可用的流程定义
* @author 赖柄沣 bingfengdev@aliyun.com
* @date 2020-08-18 13:32:36
* @version 1.0
*/
@Test
public void findProcessList(){
Page<ProcessDefinition> processDefinitionPage = processRuntime
.processDefinitions(Pageable.of(0, 10));
List<ProcessDefinition> content = processDefinitionPage.getContent();
for (ProcessDefinition processDefinition : content) {
System.out.println(processDefinition.getName());
}
} /**启动流程
* @author 赖柄沣 bingfengdev@aliyun.com
* @date 2020-08-18 13:21:12
* @version 1.0
*/
@Test
public void startProcess(){ StartProcessPayload myProcess = ProcessPayloadBuilder
.start()
.withProcessDefinitionId("myProcess_1:1:5c5e0de3-e112-11ea-a73b-287fcf13e373")
.build(); myProcess.setProcessInstanceName("张三请假");
processRuntime.start(myProcess);
System.out.println("流程实例"+myProcess.getId()); } /**查询并完成任务
* @author 赖柄沣 bingfengdev@aliyun.com
* @date 2020-08-18 13:41:40
* @version 1.0
*/
@Test
public void findAndFinishTask() {
Page<Task> taskPage = taskRuntime.tasks(Pageable.of(0, 10)); if (taskPage.getTotalItems()>0){ List<Task> content = taskPage.getContent();
for (Task task : content) {
//拾取任务
taskRuntime.claim(new ClaimTaskPayloadBuilder()
.withTaskId(task.getId())
.build());
//完成任务
taskRuntime.complete(new CompleteTaskPayloadBuilder()
.withTaskId(task.getId())
.build());
}
} } }

End

本文仅介绍如何将activiti7集成到springboot中.具体的activiti使用请参考其他博文。

本文代码github地址:https://github.com/code81192/art-demo/tree/master/springboot-activiti7

springboot2整合activiti7具体步骤的更多相关文章

  1. Spring整合Hibernate的步骤

    为什么要整合Hibernate?1.使用Spring的IOC功能管理SessionFactory对象 LocalSessionFactoryBean2.使用Spring管理Session对象  Hib ...

  2. SpringBoot2整合activiti6环境搭建

    SpringBoot2整合activiti6环境搭建 依赖 <dependencies> <dependency> <groupId>org.springframe ...

  3. SpringBoot2 整合Kafka组件,应用案例和流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.搭建Kafka环境 1.下载解压 -- 下载 wget http://mirror.bit.edu.cn/apache/kafka/2.2 ...

  4. SpringBoot2 整合 Swagger2

    SpringBoot2 整合 Swagger2 SpringBoot整合三板斧 第一步.引入pom <dependency> <groupId>com.spring4all&l ...

  5. SpringBoot2 整合 Swagger2文档 使用BootstrapUI页面

    SpringBoot2 整合 Swagger2 SpringBoot整合三板斧 第一步.引入pom <dependency> <groupId>com.spring4all&l ...

  6. Spring-boot整合Activiti7

    Spring-boot整合Activiti7 pom.xml    <properties>        <maven.compiler.source>15</mave ...

  7. SpringBoot2 整合Nacos组件,环境搭建和入门案例详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Nacos基础简介 1.概念简介 Nacos 是构建以"服务"为中心的现代应用架构,如微服务范式.云原生范式等服务基础 ...

  8. Spring整合Hibernate详细步骤

    阅读目录 一.概述 二.整合步骤 回到顶部 一.概述 Spring整合Hibernate有什么好处? 1.由IOC容器来管理Hibernate的SessionFactory 2.让Hibernate使 ...

  9. SpringBoot2 整合 Zookeeper组件,管理架构中服务协调

    本文源码:GitHub·点这里 || GitEE·点这里 一.Zookeeper基础简介 1.概念简介 Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务.从设计模式角度来 ...

随机推荐

  1. 深入探究JVM之垃圾回收算法实现细节

    @ 目录 前言 垃圾回收算法实现细节 根节点枚举 安全点 安全区域 记忆集和卡表 写屏障 并发的可达性分析 低延迟GC Shenandoah ZGC 总结 前言 本篇紧接上文,主要讲解垃圾回收算法的实 ...

  2. CORS跨域操作cookie

    CORS 跨域 在服务端设置响应头 ACAO( Access-Control-Allow-Origin )即可 前端代码,运行在 8080 端口上 $.ajax({ url:'http://local ...

  3. PHP array_fill_keys() 函数

    ------------恢复内容开始------------ 实例 用给定的指定键名的键值填充数组: <?php$keys=array("a","b",& ...

  4. ABAP 动态备份自建表数据到新表(自建表有数据的情况下要改字段长度或者其他)

    当abaper开发好一个程序给用户使用一段时间后,发现某个字段的长度需要修改,但数据库表中已经存在很多数据,冒然直接改表字段可能会导致数据丢失,这种问题的后果可能非常严重. 所以我想到先复制出一个新表 ...

  5. iOS苹果美区 Apple ID 账号最新注册教程,iPhone用户务必收藏!

    编の语 前言 今天杀手宝宝出一个注册美区ID的教程,这是目前注册苹果美区ID最快的方法,所有人适合使用! 提の示 温馨提示: 所有内容均免费分享,部分资源来自于 网络,如与版权问题联系宝宝处理! 知道 ...

  6. day1. python注释及变量

    一.注释 1.单行注释 # # python 2.x print "你好" # python 3.x print("你好") 2.多行注释 ''' '''  或 ...

  7. springMVC 与 html RESTful 解决方案

    若前端为html 而非jsp  且 拦截如下 <servlet-mapping> <servlet-name>springMVC</servlet-name> &l ...

  8. .NETCore中实现ObjectId反解

    前言 在设计数据库的时候,我们通常需要给业务数据表分配主键,很多时候,为了省事,我都是直接使用 GUID/UUID 的方式,但是在 MonggoDB 中,其内部实现了 ObjectId(以下统称为Oi ...

  9. 微信公众号如何将PDF上传到公众号?

    微信公众号如何将PDF上? 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众号添加 ...

  10. MyBatisPlus分页查询,删除操作

    分页查询 分页查询在网页使用十分之多 原始的limit进行分页 pageHelper第三方插件 3. MP内置的分页插件 导入配置 如何使用,官网的代码如下 //分页插件 @Bean public P ...