spring boot 整合activiti7及 activiti model

前言

前面用spring boot整合了activiti5 ,這次做一個升級一步步記錄如何整合及整合過程中遇到的問題,希望大家遇到類似的問題後 能快速解決

一、下載官網的demo代碼

https://github.com/Activiti/activiti-examples
下載官網的demo,下載下來後,我切到了7.0.x版本的分支,結構如下:

在這裏插入圖片描述
下載下來的代碼有很多報錯,因爲jar包找不到,打開任何一個子模塊,最下面有一個倉庫地址,activiti 7 的jar依賴需要從這個倉庫地址下載

<repositories>
    <repository>
      <id>alfresco</id>
      <name>Activiti Releases</name>
      <url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
    </repository>
  </repositories>

二、代碼整合

jar下載下來後,不報錯後,隨意選一個模塊,進行整合,我選 了activiti-api-spring-integration-example這個模塊
註解其它類,只保留 DemoApplication這個啓動類,並只保留了main方法

1、添加yml配置

# 服務配置
server:
  port: 8085

# Spring相關配置
spring:
  ##數據庫連接信息
  datasource:
    # 數據源配置
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://127.0.0.1:3309/activity?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true&nullCatalogMeansCurrent=true
    username: root
    password: 123456

    # SQLException: XAER_INVAL: Invalid arguments (or unsupported command)問題
    xa:
      properties:
        pinGlobalTxToPhysicalConnection: true
        useServerPrepStmts: true

  thymeleaf:
    mode: HTML
    encoding: utf-8
    # 禁用緩存
    cache: false
  application:
    # 註冊應用名
    name: actdemo
  mvc:
    # 靜態資源路徑
    static-path-pattern: /static/**
  # 參考配置https://www.cnblogs.com/liaojie970/p/8857710.html
  activiti:
    # 自動建表
    database-schema: activity
    database-schema-update: true
    history-level: full
    db-history-used: true

2、添加依賴

我用的Myslq,所以添加Mysql依賴,其中一些依賴是用於整合官方編輯器用的

<!-- Thymeleaf依賴 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- Activiti生成流程圖 -->
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-image-generator</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-core</artifactId>
      <version>5.2.1.RELEASE</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-json-converter</artifactId>
      <version>6.0.0</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
      <version>1.16.18</version>
    </dependency>



    <!--使用mysql數據庫,導入mysql驅動-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>



    <dependency>
      <groupId>org.apache.xmlgraphics</groupId>
      <artifactId>batik-codec</artifactId>
      <version>1.7</version>
    </dependency>


3、添加官方編輯器

activit後面的源碼下載後,已經找不到編輯器了,所以我用了之前的代碼

3.1、添加幾個主要的類

在這裏插入圖片描述

3.2、添加js

在這裏插入圖片描述

3.3、訪問列表方法http://localhost:8085/models/modelist,顯示登錄頁面

在這裏插入圖片描述
activity7 會在內存中生成一個用戶名,密碼。
用戶名固定是 : user
密碼是隨機生成UUID,密碼生成後,會在控制檯打印出現如下:

Using generated security password: 18cc84ba-b9ae-473f-92a9-d640f13136d0

ctrl+F ,查找關鍵字Using generated security password

3.4、輸入用戶名密碼後,可以顯示列表面如下:

在這裏插入圖片描述

/**
     * 獲取所有模型
     * @return
     */
    @GetMapping
    @RequestMapping("modelist")
    public String modelList(org.springframework.ui.Model model){
        securityUtil.logInAs("system");
        List<Model> models = repositoryService.createModelQuery().orderByCreateTime().desc().list();
        model.addAttribute("models",models);
        return "model/list";
    }

3.5、點擊創建新建按鈕,還是會調用後臺一個方法:

/**
     * 新建一個空模型
     * @return
     * @throws UnsupportedEncodingException
     */
    @PostMapping("newmodel")
    public Object newModel(NewModel newModel) throws UnsupportedEncodingException {
        //securityUtil.logInAs("admin");
        //初始化一個空模型
        Model model = repositoryService.newModel();

        //設置一些默認信息
        String name = newModel.getName();
        String description = newModel.getDes();
        int revision = 1;
        String key = newModel.getKey();

        ObjectNode modelNode = objectMapper.createObjectNode();
        modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);
        modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
        modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);

        model.setName(name);
        model.setKey(key);
        model.setMetaInfo(modelNode.toString());

        repositoryService.saveModel(model);
        String id = model.getId();

        //完善ModelEditorSource
        ObjectNode editorNode = objectMapper.createObjectNode();
        editorNode.put("id", "canvas");
        editorNode.put("resourceId", "canvas");
        ObjectNode stencilSetNode = objectMapper.createObjectNode();
        stencilSetNode.put("namespace",
                "http://b3mn.org/stencilset/bpmn2.0#");
        editorNode.put("stencilset", stencilSetNode);
        repositoryService.addModelEditorSource(id,editorNode.toString().getBytes("utf-8"));
        return "redirect:/static/modeler.html?modelId="+id;
    }

但是會報這個403, 貌似 是crsf
在這裏插入圖片描述

3.6、關閉csrf

@Component
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable();
    }
}

再次訪問列表頁,用戶名和密碼也不用再輸入了。

4、創建一個流程

在這裏插入圖片描述
在這裏插入圖片描述

三、遇到問題

1、jar下載失敗

切到demo中pom的倉庫,下載jar

<repositories>
    <repository>
      <id>alfresco</id>
      <name>Activiti Releases</name>
      <url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
    </repository>
  </repositories>

2、剛開始啓動時,不創建表

數據庫url中添加 &nullCatalogMeansCurrent=true

3、從activity5 中 複製的3個Java類,報錯,引入相應的Jar包即可

其中繼承了一個靜態接口的 類,去掉靜態接口繼承,直接將靜態接口中 定義的幾個常量 複製出來,自己創建一個接口即可,再重定引入,如下

public interface  ModelDataJsonConstants {
    String MODEL_ID = "modelId";
    String MODEL_NAME = "name";
    String MODEL_REVISION = "revision";
    String MODEL_DESCRIPTION = "description";
}

4、需要輸入用戶名、密碼

可以自己在內存中定義或 直接關閉crfs。
在內存定義,實際demo原本就有,現在放開註釋掉的代碼:

/**
     * 如果不注入這個bean,那麼會在內存中生一個固定用戶user , 密碼爲UUID
     * 密碼會在控制檯 打印出來,關鍵字:Using generated security password
     * @return
     */

    @Bean
    public UserDetailsService myUserDetailsService() {

        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();

        String[][] usersGroupsAndRoles = {
                //定義了2個用戶名,密碼
                {"system", "password", "ROLE_ACTIVITI_USER"},
                {"admin", "password", "ROLE_ACTIVITI_ADMIN"},
        };

        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 + "]");
            inMemoryUserDetailsManager.createUser(new User(user[0], passwordEncoder().encode(user[1]),
                    authoritiesStrings.stream().map(s -> new SimpleGrantedAuthority(s)).collect(Collectors.toList())));
        }


        return inMemoryUserDetailsManager;

    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

5、訪問新建模塊接口 403

關閉crfs

6、這一版的插件引入寫的沒有那麼詳細,可以參見

spring boot(十一) 整合Activiti工作流(三)官方編輯器插件Activiti Model

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章