springboot2 整合activiti-app (activiti6)

最近项目需要在项目中嵌入activiti工作流并提供在线流程编辑设计功能,经过网上各种资料查询,都是基本的springboot整合activiti6,

然后用activiti6提供的各种服务api实现自己的业务逻辑代码,

但是我们都知道 activiti6下载包中包含activiti-app模块,该模块已经帮我们实现了基于web的流程设计器,那我们怎么将activiti-app整和到我们的 springboot项目中呢目前没有找到可参考的整合方案,于是本人经过尝试终于成功将activiti6中的activiti-app模块整合到目前springboot2.1.7版本的项目中,实现了项目的流程在线编辑功能。现将整合中比较重要的几点记录如下

整合步骤:

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,导入这个jar包后 可能会报log冲突相关的错误,需要再导入jar包的时候 排除 slf4j

引入spring-boot-starter-data-jpa 因为activiti-app自带的相关功能 的持久化模块采用的jpa

  1. 数据源配置 activiti相关配置 留意注解

spring:

  activiti:

    async-executor-activate: true

    database-schema-update: true 
#设置为true时 启动项目自动为我们创建activiti相关的数据表

    check-process-definitions: false

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

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver#/新的mysql驱动

# 如果没有自动生成数据表 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 时需要设置为true因为activiti-app-rest 用 liquibase管理了一些流程设计相关的表

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

liquibase:

    enabled: true

    change-log: classpath:changelog.xml

# activiti-app-rest 中 FileSystemContentStorage 的相关配置用来再文件系统中保存相关东西

contentstorage:

  fs:

    rootFolder: /data

    createRoot: true

    depth: 4

    blockSize: 1024

3.org.activiti.spring.boot.SecurityAutoConfiguration


//启动时排除org.activiti.spring.boot.SecurityAutoConfiguration.class activiti中的这个类,这是activiti-app-rest默认使用的SpringSecurity 的相关配置类,去掉后,我们自己的项目必须要引入SpringSecurity  因为activiti-app-rest 获取当前用户是通过 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.注意点


需要将activiti-app-rest 中的控制器和 jpa 相关的dao Entity引入引入到项目中

5.整合完成后,流程在线配置可以直接调用 activiti-app 中的配置功能包括界面和接口,但是activit-app中的表单配置功能有问题。
1.创建的表单和流程关联后,流程发起时获取关联表单配置报错
2.流程发布后 关联的表单无法发布,涉及的数据表数据为空 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.构建 FormEngineConfigurator 对象 
  2. 创建类继承ProcessEngineConfigurationConfigurer 接口
  3. 在ProcessEngineConfigurationConfigurer接口的实现类中将 FormEngineConfigurator对象注入到 
        SpringProcessEngineConfiguration 中 如下:
  
   @Component
public class MiniProcessEngineConfigurationConfigurer implements ProcessEngineConfigurationConfigurer {

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

}      

最后实现的效果如下:

jietu.png

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容