如何通过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
相关产品推荐
相关产品推荐

