springboot2 整合activiti-app (activiti6)

最近項(xiàng)目需要在項(xiàng)目中嵌入activiti工作流并提供在線流程編輯設(shè)計(jì)功能,經(jīng)過網(wǎng)上各種資料查詢,都是基本的springboot整合activiti6,

然后用activiti6提供的各種服務(wù)api實(shí)現(xiàn)自己的業(yè)務(wù)邏輯代碼,

但是我們都知道 activiti6下載包中包含activiti-app模塊,該模塊已經(jīng)幫我們實(shí)現(xiàn)了基于web的流程設(shè)計(jì)器,那我們怎么將activiti-app整和到我們的 springboot項(xiàng)目中呢目前沒有找到可參考的整合方案,于是本人經(jīng)過嘗試終于成功將activiti6中的activiti-app模塊整合到目前springboot2.1.7版本的項(xiàng)目中,實(shí)現(xiàn)了項(xiàng)目的流程在線編輯功能?,F(xiàn)將整合中比較重要的幾點(diǎn)記錄如下

整合步驟:

1:添加maven 包依賴:


<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-dependencies</artifactId>

<version>2.1.7.RELEASE</version>

<type>pom</type>

   <scope>import</scope>

</dependency>

<dependency>

</dependencyManagement>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>org.activiti</groupId>

<artifactId>activiti-spring-boot-starter-basic</artifactId>

<version>${activiti.version}</version>

</dependency>

<dependency>

<groupId>org.activiti</groupId>

<artifactId>activiti-app-rest</artifactId>

<version>${activiti.version}</version>

<exclusions>

<exclusion>

            <groupId>org.slf4j</groupId>

            <artifactId>slf4j-api</artifactId>

      </exclusion>

</exclusions>

</dependency>

注意:整合activiti-app 就是整合 activiti-app-rest,導(dǎo)入這個(gè)jar包后 可能會報(bào)log沖突相關(guān)的錯(cuò)誤,需要再導(dǎo)入jar包的時(shí)候 排除 slf4j

引入spring-boot-starter-data-jpa 因?yàn)閍ctiviti-app自帶的相關(guān)功能 的持久化模塊采用的jpa

  1. 數(shù)據(jù)源配置 activiti相關(guān)配置 留意注解

spring:

  activiti:

    async-executor-activate: true

    database-schema-update: true 
#設(shè)置為true時(shí) 啟動(dòng)項(xiàng)目自動(dòng)為我們創(chuàng)建activiti相關(guān)的數(shù)據(jù)表

    check-process-definitions: false

    process-definition-location-prefix: classpath*:/processes/

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver#/新的mysql驅(qū)動(dòng)

# 如果沒有自動(dòng)生成數(shù)據(jù)表 mysql連接后增加 nullCatalogMeansCurrent=true 具體原理可自行查看

    url: jdbc:mysql://xxxxxxxx:3306/xxx?characterEncoding=utf-8&serverTimezone=UTC&nullCatalogMeansCurrent=true

    username: xxx

    password: xxx

    type: com.zaxxer.hikari.HikariDataSource #連接池

    hikari:

      connection-test-query: SELECT 1

#很多整合方案中 建議 liquibase.enabled=false,但是再整合activiti-app-rest 時(shí)需要設(shè)置為true因?yàn)閍ctiviti-app-rest 用 liquibase管理了一些流程設(shè)計(jì)相關(guān)的表

#比如ACT_DE_MODEL等,liquibase需要的db.changelog-master.xml可以再activiti-app-rest中去找

liquibase:

    enabled: true

    change-log: classpath:changelog.xml

# activiti-app-rest 中 FileSystemContentStorage 的相關(guān)配置用來再文件系統(tǒng)中保存相關(guān)東西

contentstorage:

  fs:

    rootFolder: /data

    createRoot: true

    depth: 4

    blockSize: 1024

3.org.activiti.spring.boot.SecurityAutoConfiguration


//啟動(dòng)時(shí)排除org.activiti.spring.boot.SecurityAutoConfiguration.class activiti中的這個(gè)類,這是activiti-app-rest默認(rèn)使用的SpringSecurity 的相關(guān)配置類,去掉后,我們自己的項(xiàng)目必須要引入SpringSecurity  因?yàn)閍ctiviti-app-rest 獲取當(dāng)前用戶是通過 SpringSecurity 的 authentication對象

@SpringBootApplication(exclude = org.activiti.spring.boot.SecurityAutoConfiguration.class)

public class DemoApplication {

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

}

//再自己的UserDetailsService loadUserByUsername 方法中封裝ActivitiAppUser  這是 activiti-app-rest中的SpringSecurity User
@Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserEF userExists = userEfService.GetUserByAccount(username.trim());
        if(userExists != null) {
           List<org.activiti.engine.identity.User> activitUsers =   identityService.createUserQuery()
            .userId(userExists.getId().toString())
            .list();
            if(CollectionUtils.isNotEmpty(activitUsers)) {
                
                ActivitiAppUser acu = new ActivitiAppUser(activitUsers.get(0),username.trim(),AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
                return acu;
                //return new User(username.trim(),userExists.getUserPwd().trim(),AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
                
            }
            
        }
        return null;
    }

4.注意點(diǎn)


需要將activiti-app-rest 中的控制器和 jpa 相關(guān)的dao Entity引入引入到項(xiàng)目中

5.整合完成后,流程在線配置可以直接調(diào)用 activiti-app 中的配置功能包括界面和接口,但是activit-app中的表單配置功能有問題。
1.創(chuàng)建的表單和流程關(guān)聯(lián)后,流程發(fā)起時(shí)獲取關(guān)聯(lián)表單配置報(bào)錯(cuò)
2.流程發(fā)布后 關(guān)聯(lián)的表單無法發(fā)布,涉及的數(shù)據(jù)表數(shù)據(jù)為空 act_fo_form_deployment,act_fo_form_definition ,act_fo_* 等

解決辦法:

 引入包
 <dependency>
         <groupId>org.activiti</groupId>
         <artifactId>activiti-form-engine-configurator</artifactId>
         <version>${activiti.version}</version>
 </dependency>
 1.構(gòu)建 FormEngineConfigurator 對象 
  2. 創(chuàng)建類繼承ProcessEngineConfigurationConfigurer 接口
  3. 在ProcessEngineConfigurationConfigurer接口的實(shí)現(xiàn)類中將 FormEngineConfigurator對象注入到 
        SpringProcessEngineConfiguration 中 如下:
  
   @Component
public class MiniProcessEngineConfigurationConfigurer implements ProcessEngineConfigurationConfigurer {

 @Autowired
 private FormEngineConfigurator formEngineConfigurator;
 
 @Override
 public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
     processEngineConfiguration.addConfigurator(formEngineConfigurator);
 
 }

}      

最后實(shí)現(xiàn)的效果如下:

jietu.png

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容