You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Spring Boot+REST将BPMN/DMN部署至Camunda流程引擎?

Camunda 7.13.0 BPMN/DMN 文件部署方案(Spring Boot + 前端)

前置环境确认

  • Spring Boot应用已完成与Camunda数据库的连接,数据库包含完整的Camunda核心表(如dbo.ACT_HI_PROCINST、dbo.ACT_HI_TASKINST、dbo.ACT_RU_TASK等)
  • 前端(Angular/React)已实现本地文件选择功能,仅允许选择.bpmn或.dmn格式的有效文件

Spring Boot 后端实现

1. 依赖配置

确保Spring Boot项目中引入对应版本的Camunda Starter依赖(以Maven为例):

<dependency>
    <groupId>org.camunda.bpm.springboot</groupId>
    <artifactId>camunda-bpm-spring-boot-starter</artifactId>
    <version>7.13.0</version>
</dependency>

2. 部署接口编写

创建REST控制器,接收前端上传的文件并调用Camunda API完成部署:

import org.camunda.bpm.engine.RepositoryService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class CamundaDeploymentController {

    private final RepositoryService repositoryService;

    // 构造注入RepositoryService
    public CamundaDeploymentController(RepositoryService repositoryService) {
        this.repositoryService = repositoryService;
    }

    @PostMapping("/deploy-camunda-resource")
    public ResponseEntity<String> deployResource(@RequestParam("file") MultipartFile file) {
        // 后端二次校验文件格式
        String fileName = file.getOriginalFilename();
        if (fileName == null || (!fileName.endsWith(".bpmn") && !fileName.endsWith(".dmn"))) {
            return ResponseEntity.badRequest().body("仅支持上传.bpmn或.dmn格式文件");
        }

        try {
            // 按文件名部署,自动生成最新版本
            repositoryService.createDeployment()
                    .name(fileName.replace(".bpmn", "").replace(".dmn", "")) // 用文件名作为部署名称
                    .addInputStream(fileName, file.getInputStream()) // 以原文件名作为资源名,确保版本追踪
                    .enableDuplicateFiltering(false) // 关闭重复过滤,强制部署新版本(即使内容相同)
                    .deploy();

            return ResponseEntity.ok(String.format("文件%s已成功部署为最新版本", fileName));
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("部署失败:" + e.getMessage());
        }
    }
}

3. 核心逻辑说明

  • 使用Camunda的RepositoryService执行部署操作,这是官方推荐的标准部署方式
  • addInputStream方法以原文件名作为资源标识,Camunda会自动为同名资源维护版本号,确保每次上传的文件都是最新版本
  • enableDuplicateFiltering(false)保证即使文件内容未变更,也会生成新的部署版本(若不需要强制更新,可设为true,此时内容相同则跳过部署)

前端调用示例

Angular 示例

import { HttpClient } from '@angular/common/http';
import { Component } from '@angular/core';

@Component({
  selector: 'app-deploy',
  templateUrl: './deploy.component.html'
})
export class DeployComponent {
  constructor(private http: HttpClient) {}

  onFileSelected(event: Event) {
    const file = (event.target as HTMLInputElement).files?.[0];
    if (!file) return;

    const formData = new FormData();
    formData.append('file', file);

    this.http.post('/deploy-camunda-resource', formData, { responseType: 'text' })
      .subscribe({
        next: (res) => alert(res),
        error: (err) => alert('部署失败:' + err.error)
      });
  }
}

React 示例

import axios from 'axios';

function DeployComponent() {
  const handleFileChange = (event) => {
    const file = event.target.files[0];
    if (!file) return;

    const formData = new FormData();
    formData.append('file', file);

    axios.post('/deploy-camunda-resource', formData, { responseType: 'text' })
      .then(res => alert(res.data))
      .catch(err => alert('部署失败:' + err.response.data));
  };

  return (
    <div>
      <input type="file" accept=".bpmn,.dmn" onChange={handleFileChange} />
    </div>
  );
}

export default DeployComponent;

关键注意事项

  • 后端需确保RepositoryService已被Spring正确注入(Camunda Starter会自动配置相关Bean)
  • 若需批量部署多个文件,可修改接口参数为@RequestParam("files") MultipartFile[] files,循环处理每个文件
  • 部署后可通过Camunda的RepositoryService查询部署版本,或在Camunda Cockpit中查看最新资源版本

内容的提问来源于stack exchange,提问作者Prince Abhijeet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:15:35