操作简述

  • SpringBoot官方未提供直接的starter与Activiti集成,但是集成的过程并不困难。
    1. 导依赖
    2. 配置属性
    3. 配置Bean
    4. 启动测试

第一步:导入依赖

  • 父项目导入依赖:Activiti提供独立于spring的POM,以简化使用activiti的依赖。在项目根下的pom.xml文件中导入:
<properties>
    <activiti.version>7.10.0</activiti.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-dependencies</artifactId>
            <version>${activiti.version}</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>
  • 父项目添加Activiti仓库地址:Activiti有些jar包,未上传到中央仓库,因此需要添加Activiti的仓库
<repositories>
    <repository>
        <id>activiti-releases</id>
        <url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases</url>
    </repository>
</repositories>
  • 子项目导入Activiti依赖:在要使用的Activiti的模块中直接导入下面starter即可导入Activiti的依赖
    • 另外Activiti需要使用到数据库,它支持Mysq、Oracle、Postgres等多种数据库,这里使用mysql进行演示
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

第二步:配置属性

  • 在application.yml或者bootstrap.yml文件中配置引入框架的常用属性
spring:
  activiti:
    database-schema-update: true # 自动创建数据库
    db-history-used: true # 开启流程历史记录
    history-level: full # 历史流程数据全部记录到历史表中,支持none、activity、audit、full,4种粒度的数据
  • 配置数据源:需要先创建数据库,如dev-demo,配置url
spring:
  datasource:
    password: xxxxxxx
    username: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.1.2:3306/dev-demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&nullCatalogMeansCurrent=true
  • url中的nullCatalogMeansCurrent参数需要设置成true,表示Activiti优先在url中指定的数据库中检查是否有创建过表。否则,则会遍历整个数据源中的每个数据库,检查是否有创建过activiti的表

第三步:配置Bean

  • 在Activiti7中,默认集成SpringSecurity,内部还使用到SpringSecurity系列的上下文代码,不能直接排除掉,因此在此还需要给定一些SpringSecurity的初始配置Bean。
  • 这里为了避开对SpringSecurity的使用,因此直接把SpringSecurity相关配置置空即可
    • UserGroupManager:用于流程中获取用户的组、角色等信息
    • SecurityManager:用于获取当前操作授权的用户、组或角色等信息
  • 注意,这里提供的代码中,会提示SecurityManager弃用,而产生报错,不过可以测试成功,有能力的小伙伴可以尝试解决这个问题,SpringSecurity不是本文的重点
@Bean
public UserGroupManager userGroupManager() {
    return new UserGroupManager() {
        @Override
        public List<String> getUserGroups(String s) {
            return null;
        }

        @Override
        public List<String> getUserRoles(String s) {
            return null;
        }

        @Override
        public List<String> getGroups() {
            return null;
        }

        @Override
        public List<String> getUsers() {
            return null;
        }
    };
}

@Bean
public SecurityManager securityManager() {
    return new SecurityManager() {
        public String getAuthenticatedUserId() {
            return "miukoo-user-1";
        }
        
        public List<String> getAuthenticatedUserGroups() throws SecurityException {
            return null;
        }

        public List<String> getAuthenticatedUserRoles() throws SecurityException {
            return null;
        }
    };
}
  • 浅改一下,可能有用(未验证代码)
@Configuration
public class SecurityConfig {

    @Bean
    public UserGroupManager userGroupManager() {
        return new UserGroupManager() {
            @Override
            public List<String> getUserGroups(String s) {
                return null;
            }

            @Override
            public List<String> getUserRoles(String s) {
                return null;
            }

            @Override
            public List<String> getGroups() {
                return null;
            }

            @Override
            public List<String> getUsers() {
                return null;
            }
        };
    }

    @Bean
    public AuthenticationProvider authenticationProvider() {
        return new AuthenticationProvider() {
            @Override
            public Authentication authenticate(Authentication authentication) throws AuthenticationException {
                return new UsernamePasswordAuthenticationToken("miukoo-user-1", null, null);
            }

            @Override
            public boolean supports(Class<?> authentication) {
                return authentication.equals(UsernamePasswordAuthenticationToken.class);
            }
        };
    }

    @Bean
    public SecurityContext securityContext() {
        return SecurityContextHolder.getContext();
    }
} 

启动测试

  • 只需启动服务,如果控制台没有报错,数据库中成功创建表,集成成功!
12-15 17:29