Spring-boot整合Activiti7

Spring-boot整合Activiti7

pom.xml

    <properties>
        <maven.compiler.source>15</maven.compiler.source>
        <maven.compiler.target>15</maven.compiler.target>
        <activiti.version>7.1.0.M6</activiti.version>
        <mybatis-plus.version>3.3.1</mybatis-plus.version>
    </properties>
​
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/>
    </parent>
​
    <dependencies>
        <!-- Activiti -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- java繪製activiti流程圖 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-image-generator</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- activiti json轉換器-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- svg轉png圖片工具-->
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-all</artifactId>
            <version>1.10</version>
        </dependency>
​
        <!-- web啟動器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
​
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
​
        <!--mybatis-plusǷ-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
​
        <!-- SpringSecurity -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
​
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
​
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
​
​
​
</project>

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<String> 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();
    }
}
​
Tags: