Spring-boot整合Activiti7


Spring-boot整合Activiti7

pom.xml

    
        15
        15
        7.1.0.M6
        3.3.1
    
?
    
        org.springframework.boot
        spring-boot-starter-parent
        2.6.6
        
    
?
    
        
        
            org.activiti
            activiti-spring-boot-starter
            ${activiti.version}
        
        
        
            org.activiti
            activiti-image-generator
            ${activiti.version}
        
        
        
            org.activiti
            activiti-json-converter
            ${activiti.version}
        
        
        
            org.apache.xmlgraphics
            batik-all
            1.10
        
?
        
        
            org.springframework.boot
            spring-boot-starter-web
        
?
        
            mysql
            mysql-connector-java
        
?
        
        
            com.baomidou
            mybatis-plus-boot-starter
            ${mybatis-plus.version}
        
?
        
        
            org.springframework.boot
            spring-boot-starter-security
        
?
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    
?
    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    
?
?
?

Springboot整合Activiti时,需要整合SpringSecurity否则就会报错

application.yml文件

server:
  port: 80
  servlet:
    context-path: /workflow
?
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/activiti-boot?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
    username: root
    password: root
?
  #activiti配置
  activiti:
    # 自动更新数据库结构
    # true:适用开发环境,默认值。activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
    # false:适用生产环境。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
    # create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
    # drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
    database-schema-update: true
    # activiti7与springboot整合后默认不创建历史表,需要手动开启
    db-history-used: true
    # 记录历史等级 可配置的历史级别有none, activity, audit, full
    # none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
    # activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
    # audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。
    # full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数
    # 据,包括一些流程参数等。
    history-level: full
    # 是否自动检查resources下的processes目录流程定义文件
    check-process-definitions: false
    
# 日志级别是debug才能显示SQL日志
logging:
  level:
    org.activiti.engine.impl.persistence.entity: debug
?

数据库mysql:5.7

主启动类

@SpringBootApplication
public class workflowApplication {
?
    public static void main(String[] args) {
        SpringApplication.run(workflowApplication.class,args);
    }
}

测试类

@SpringBootTest
public class ActivitiTesto1 {
?
    @Autowired
    ProcessEngine processEngine;
?
    @Autowired
    RepositoryService repositoryService;
?
    @Test
    public void getProcessEngine() {
        System.out.println("processEngine: " + processEngine);
    }

返回结果

processEngine: org.activiti.engine.impl.ProcessEngineImpl@4cddc3d9 //获取流程实例的时候,数据库的25张表就已经创建出来了.

通过zip压缩包部署流程定义

    /**
     * 通过zip压缩包部署流程定义
     */
    @Test
    public void deplayByZip(){
        //部署流程定义
        //读取zip资源压缩包,转成输入流
        InputStream is = ReflectUtil.getResourceAsStream("processes/leave.zip");
        ZipInputStream zipInputStream = new ZipInputStream(is);
        Deployment deployment = repositoryService.createDeployment()
                .addZipInputStream(zipInputStream)
                .name("请假申请流程压缩包-boot")
                .deploy();
        //部署输出结果
        System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }

返回结果

d5c1d3f3-dd04-11ec-a50b-54e1ad82f401
请假申请流程压缩包-boot

整合SpringSecurity

activiti7 与 SpringSecurity 强耦合, 创建安全认证配置类SpringSecurityConfig 类

@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    private final Logger logger = LoggerFactory.getLogger(SpringSecurityConfig.class);
?
    /**
     * 内存 UserDetailsManager
     */
    @Bean
    public UserDetailsService myUserDetailsService() {
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new
                InMemoryUserDetailsManager();
        // 初始化账号角色数据
        addGroupAndRoles(inMemoryUserDetailsManager);
        return inMemoryUserDetailsManager;
    }
?
    private void addGroupAndRoles(UserDetailsManager userDetailsManager) {
        // 注意:后面流程办理人,必须是当前存在的用户 username
        String[][] usersGroupsAndRoles = {
                {"wkh", "123456", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
                {"zdx", "123456", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
                {"wll", "123456", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},
                {"wsy", "123456", "ROLE_ACTIVITI_ADMIN", "GROUP_otherTeam"},
                {"zyb", "123456", "ROLE_ACTIVITI_ADMIN", "GROUP_otherTeam"},
                {"gj", "123456", "ROLE_ACTIVITI_ADMIN", "GROUP_otherTeam"}
        };
?
        for (String[] user : usersGroupsAndRoles) {
            List authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, 2,
                    user.length));
            logger.info("> Registering new user: " + user[0] + " with the following Authorities[" + authoritiesStrings + "]");
            userDetailsManager.createUser(new User(user[0],
                    passwordEncoder().encode(user[1]),
                    authoritiesStrings.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList())));
        }
    }
?
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
    }
?
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
?