1. 程式人生 > >一、SpringBoot整合Activiti Modeler(坑已踩)

一、SpringBoot整合Activiti Modeler(坑已踩)

一、整合準備

下載activiti原始碼及activiti-5.22.zip

  1. 原始碼下載

  2. Activiti-5.22.0.zip下載

二、複製專案檔案到自己的專案中

  1. 進入原始碼檔案中的modules\activiti-webapp-explorer2\src\main\webapp目錄,複製diagram-viewereditor-app
    modeler.html三個檔案到springboot專案中的resources目錄下。(主要是前端頁面)
  2. 解壓activiti-5.22.0.zip,在Activiti-5.22.0的libs中找到activiti-modeler-5.22.0-sources.jar,將其解壓,將會找到以下三個類:(三個controller)
  3. 將以下三個類複製到自己的springboot專案的包中,只要包是位於啟動類的下層包即可,這樣springboot就會自動掃描到這三個類。
  4. 將原始碼路徑modules\activiti-webapp-explorer2\src\main\resources\stencilset.json
    複製到springboot專案中的resources目錄下。(這個檔案是控制介面的語言的,附一箇中文的檔案下載地址stencilest.json-中文
  5. 至此,所有需要的檔案都複製完成,接下來,我們開始配置修改。專案結構如下:

三、修改配置

1.新增依賴,並重新整理專案(這是Gradle的,Maven自己轉換一下)

    dependencies {
        compile('org.activiti:activiti-spring-boot-starter-basic:5.22.0')
        compile("org.springframework.boot:spring-boot-starter-web"
)
testCompile('org.springframework.boot:spring-boot-starter-test') compile('org.activiti:activiti-modeler:5.22.0') compile('commons-io:commons-io:2.5') }

2.修改springboot的啟動類, 在類上加如下註解,關閉security功能。主要是因為activiti的依賴中含有spring security的jar包,所以springboot會自動配置安全功能,訪問時就需要輸入密碼。

@EnableAutoConfiguration(exclude = {
        org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class,
        org.activiti.spring.boot.SecurityAutoConfiguration.class,
})

3.修改 resources目錄下的app-cfg.js, 如下更改(這個是專案的路徑,springboot是不需要專案路徑的,所以把專案路徑刪除掉)

ACTIVITI.CONFIG = {
    'contextRoot' : '/service',
};

4.還記得我們前面複製進來的三個類嗎?

在每個類的類名上加上RequestMapping(value = “/service”)註解。(頁面會訪問這個路徑)

5.修改ModelSaveRestResource
(不修改這個的話,在頁面儲存流程時會報錯)

@RestController
@RequestMapping(value = "/service")
public class ModelSaveRestResource implements ModelDataJsonConstants {

  protected static final Logger LOGGER = LoggerFactory.getLogger(ModelSaveRestResource.class);

  @Autowired
  private RepositoryService repositoryService;

  @Autowired
  private ObjectMapper objectMapper;

  @RequestMapping(value="/model/{modelId}/save", method = RequestMethod.PUT)
  @ResponseStatus(value = HttpStatus.OK)
  public void saveModel(@PathVariable String modelId, @RequestParam("name") String name,
                        @RequestParam("json_xml") String json_xml, 
                        @RequestParam("svg_xml") String svg_xml,
                        @RequestParam("description") String description) {//對接收引數進行了修改
    try {

      Model model = repositoryService.getModel(modelId);

      ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());

      modelJson.put(MODEL_NAME, name);
      modelJson.put(MODEL_DESCRIPTION, description);
      model.setMetaInfo(modelJson.toString());
      model.setName(name);

      repositoryService.saveModel(model);

      repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));

      InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));
      TranscoderInput input = new TranscoderInput(svgStream);

      PNGTranscoder transcoder = new PNGTranscoder();
      // Setup output
      ByteArrayOutputStream outStream = new ByteArrayOutputStream();
      TranscoderOutput output = new TranscoderOutput(outStream);

      // Do the transformation
      transcoder.transcode(input, output);
      final byte[] result = outStream.toByteArray();
      repositoryService.addModelEditorSourceExtra(model.getId(), result);
      outStream.close();

    } catch (Exception e) {
      LOGGER.error("Error saving model", e);
      throw new ActivitiException("Error saving model", e);
    }
  }
}

四、編寫測試

新建一個controller如下

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author [email protected]
 * @date 2017/8/22 下午6:00
 * @desc .
 */
@RestController
@RequestMapping("/activiti")
public class ActivitiController {
    /**
     * 建立模型
     */
    @RequestMapping("/create")
    public void create(HttpServletRequest request, HttpServletResponse response) {
        try {
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

            RepositoryService repositoryService = processEngine.getRepositoryService();

            ObjectMapper objectMapper = new ObjectMapper();
            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);
            Model modelData = repositoryService.newModel();

            ObjectNode modelObjectNode = objectMapper.createObjectNode();
            modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, "hello1111");
            modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
            String description = "hello1111";
            modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
            modelData.setMetaInfo(modelObjectNode.toString());
            modelData.setName("hello1111");
            modelData.setKey("12313123");

            //儲存模型
            repositoryService.saveModel(modelData);
            repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));
            response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + modelData.getId());
        } catch (Exception e) {
            System.out.println("建立模型失敗:");
        }
    }
}

啟動專案訪問localhost:8080/activiti/create,看看是不是可以看到編輯頁面了呢?
配置過程一定要細心,稍微不小心就會失敗,其中有很多坑,慢慢解決就好

相關推薦

SpringBoot整合Activiti Modeler()

一、整合準備 下載activiti原始碼及activiti-5.22.zip 原始碼下載 GitHub地址,下載之後使用命令git checkout 5.22.0-release切換到5.22.0-release分支 網盤地址 Activiti-

springboot 整合kafka系列 springboot整合kafka生產者

1、新建springboot腳手架工程,pom檔案如下,其中引入了kafka需要的依賴,注意這裡的kafka版本號需要和之前安裝的kafka版本一致,要不然會有問題 <?xml version="1.0" encoding="UTF-8"?> <proje

SpringBoot 整合 Lombok

(一)新增依賴 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>

SpringBoot系列十SpringBoot整合Restful架構(使用 RestTemplate 模版實現 Rest 服務調用Swagger 集成動態修改日誌級別)

attribute tar ring 動態修改 包含 分布式 restfu pen 負載 1、概念:SpringBoot整合Restful架構 2、背景 Spring 與 Restful 整合才是微架構的核心,雖然在整個 SpringBoot(SpringCloud)之中提

SpringBoot 整合Activiti

最近在學習Activiti工作流,學習過程整理下,方便以後回顧。 我這裡用的Activiti版本是5.22,考慮後面應該會做線上繪製流程圖,而6.0版本網上資訊過少。。。(如下配置6.0也可試用) 專案目錄結構如下: 1、pom.xml配置SpringBoot和Acti

SpringBoot熱部署

重啟 png boot alt 部署 無需 發布 調試 .cn 一、熱部署優點: 1、無論本地還是線上都適用 2、無需重啟服務器 (1)提高開發、調試效率 (2)提升發布、運維效率、降低運維成本 二、和熱加載的區別 一、SpringBoot熱部署

springboot整合Spring-data-jpa

ast bstr 核心 public html 特殊 ssi 除了 使用方法 1.Spring Data JPA是什麽   由Spring提供的一個用於簡化JPA開發的框架。可以在幾乎不用寫實現的情況下,實現對數據的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的

springboot整合redis

clu com figure pri alt pass oot wired 用戶登錄 整合Redis 一. 註解方式實現添加緩存   1.在pom.xml加入依賴 <!-- 配置使用redis啟動器 --> <dependency> <

springboot整合activiti報錯[processes/]不存在解決方案

except nested key code 解決 nes file exceptio processes springboot整合activiti時,啟動拋異常 nested exception is java.io.FileNotFoundException: clas

SpringBoot28 RabbitMQ知識點Docker下載RabbitMQSpringBoot整合RabbtiMQ

wired provide 進行 prop oca key plugin sim clu 1 RabbitMQ知識點   1.1 整體架構圖     消息生產者將消息投遞到exchange中,exchange會以某種路由機制將生產者投遞的消息路由到queue中,消息消費

springboot整合activeMq 跳

final model com red fas https from rom pac 安裝   activeMq 安裝請看我的另一篇https://www.cnblogs.com/milicool/p/8420926.html 版本   springboot 2.0.5.R

【Spring Boot】(30)SpringBoot整合RabbitMQ

1、安裝 1.1、Erlang: Erlang下載地址,下載後安裝即可。 1.2、RabbitMQ安裝 RabbitMQ下載地址,下載後安裝即可。 注意:Erlang的版本要與RabbitMQ版本需要匹配才行。 RabbitMQ Mini

【Spring Boot】(29)SpringBoot整合Mybatis原始碼分析

在【Spring Boot】(23)、Spring Boot整合Mybatis的章節中講述了SpringBoot整合Mybatis的過程,以及一些配置說明,這節主要講解一下整合的原始碼。 廢話不多說,直接進入今天的主題。 閱讀過我之前寫的文章的童靴,肯定知道SpringBoot整合第三方

【Spring Boot】(32)SpringBoot整合AOP

1、新增pom依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</art

Activiti】從入門到放棄——專案實戰之整合Activiti-Modeler

引入 在activiti-explorer中,我們可以在Eclipse中設計完成了流程,然後匯入流程模型,也可以通過線上流程設計器進行設計,然後部署得到流程模型。然後把流程模型部署得到流程定義。 實際上客戶是可能不會使用Eclipse的,所以我們必須在專案中整合線上流程設計器。整合

springspringboot整合hadoop的時候出現的許可權問題

相信大家在使用spring、springboot整合hadoop的時候,操作許可權的時候可能會遇到下面這樣一個許可權異常 Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.

SpringBoot入門學習—— SpringBoot的特點

一、SpringBoot的特點    微服務介紹 1. 什麼是微服務       在介紹微服務時,首先得先理解什麼是微服務,顧名思義,微服務得從兩個方面去理解,什麼是"微"、什麼是"服務", 微 狹義來講就是體積小、著名的"2 pizza 團隊"很好的詮

二十六Springboot整合kafka

(一)新增依賴 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</a

springboot整合activiti工作流時容易出現的問題

No.1 啟動報錯 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.activiti.spring.boot.SecurityAutoConfiguration': In

springboot系列springboot產生背景及介紹

一、為什麼用Springboot 長期以來 Java 的開發一直讓人所詬病: ·Java 專案開發複雜度極其高; · Java 專案的維護非常困難; · 在雲時代如何實現專案的快速部署以及快速啟動; · 即便使用了大量的開發框架,發現我們的開發也沒少多少; · 當所有的人認為 Spring 不在前