
Camunda Platform REST API OpenAPI 文檔自動生成基于 FreeMarker 模板的 openapi.json 構建體系【免費下載鏈接】camunda-bpm-platformCamunda 7 CE is End of Life (EoL). Please check out Camunda 8 instead (https://github.com/camunda/camunda) or read about Camunda 7 Enterprise End of Life (https://camunda.com/blog/2025/02/camunda-7-enterprise-end-of-life-extension/) – Camunda 7 CE was a flexible framework for workflow and decision automation using BPMN and DMN.項目地址: https://gitcode.com/GitHub_Trending/ca/camunda-bpm-platform導讀本文圍繞 Camunda Platformcamunda-bpm-platform倉庫中的engine-rest/engine-rest-openapi模塊系統(tǒng)講解 Camunda REST API 的 OpenAPI 3.0.2 文檔是如何從源碼模板自動生成的包括mvn clean install觸發(fā)的四階段構建流水線、FreeMarker 模板的目錄結構與編寫規(guī)范main.ftl、lib/utils.ftl、models、paths、commons、宏macro體系的設計意圖以及評審Review與質(zhì)量保障流程。讀完本文你將掌握如何為一個新的 REST 端點添加 OpenAPI 描述、如何正確使用parameter/property/requestBody/response等宏、如何通過排序/分頁公共模板保持文檔一致性并理解生成出的 openapi.json 如何反向驅(qū)動 Java Client 生成與 WireMock 冒煙測試。一、模塊定位一份 openapi.json 覆蓋整個 Engine REST APIengine-rest/engine-rest-openapi是 Camunda Platform 中專門負責OpenAPI 文檔生成的 Maven 模塊artifactId 為camunda-engine-rest-openapi。它的核心目標非常單一解析一組 FreeMarker 模板生成一份格式化良好的openapi.json其中包含 Camunda Engine REST API 的完整 OpenAPI 文檔。該文檔對齊OpenAPI Specification 3.0.2OpenAPI 3.0.2 規(guī)范中的info、servers、tags、paths、components/schemas、securitySchemes等對象均在生成結果中體現(xiàn)。從 pom.xml 可以看到模塊還依賴同倉庫的camunda-engine-rest-openapi-generator模塊TemplateParser、SchemaValidator兩個 Java 類并聲明了 openapi-generator-maven-plugin、WireMock、AssertJ 等測試依賴。模塊當前處于7.24.0-SNAPSHOT版本倉庫快照版本實際發(fā)布版本以倉庫 pom 為準。二、構建流水線一次mvn clean install的四階段原文檔明確指出構建命令為mvn clean install在 pom.xml 中構建被編排為四個相互銜接的階段全部通過 Maven 插件綁定到生命周期中階段 1模板解析生成格式化 openapi.jsonexec-maven-plugin的generate-openapi-json執(zhí)行體綁定在generate-resources階段調(diào)用主類org.camunda.bpm.engine.rest.openapi.generator.impl.TemplateParser參數(shù)為${project.basedir}/src/main/templates模板源目錄main.ftl主模板入口${generated-directory}/openapi.json輸出文件即target/generated-sources/openapi-json/openapi.json${project.build.directory}中間調(diào)試輸出目錄從 TemplateParser.java 的實現(xiàn)可以看到完整處理流程使用 FreeMarkerConfiguration.VERSION_2_3_29加載main.ftl模板createTemplateData()掃描模板目錄構建模板數(shù)據(jù)模型modelsDTO 名 → 包路徑的映射按名稱字典序排序與endpoints端點路徑 → HTTP 方法列表的映射同樣字典序排序模板渲染后先寫出一份帶時間戳的intermediate-openapi-*.json中間文件便于調(diào)試再用 GsonsetPrettyPrinting()serializeNulls()對 JSON 進行格式化并落盤為最終openapi.json。值得注意的是路徑解析約定resolvePaths端點的 URL 路徑直接從文件系統(tǒng)的目錄結構推導——例如src/main/templates/paths/process-instance/count/get.ftl會被解析為GET /process-instance/count。模板文件名去掉.ftl后綴即 HTTP 方法名。階段 2Schema 校驗同一階段的validate-openapi-json執(zhí)行體調(diào)用org.camunda.bpm.engine.rest.openapi.generator.impl.SchemaValidator使用倉庫內(nèi)置的 schema.jsonOpenAPI 3.0 官方 JSON Schema 的本地副本取自 2020-02-11對生成的 openapi.json 做結構校驗。SchemaValidator.java 使用networknt的JsonSchemaFactory加載 schema 并validate()生成的文檔一旦出現(xiàn)任何ValidationMessage錯誤直接拋出RuntimeException(Schema validation errors\n messages)使構建失敗。這保證了模板變更不會產(chǎn)出結構非法的 OpenAPI 文檔。階段 3從 openapi.json 生成 Java Clientopenapi-generator-maven-plugin版本 4.2.3的generate-java-client執(zhí)行體綁定在generate-test-sources階段以剛生成的openapi.json為輸入inputSpec輸出到target/camunda-openapi-clientgeneratorNamejava并配置dateLibrarylegacy。隨后build-helper-maven-plugin把生成的客戶端源碼加入測試源碼目錄。這一階段意味著每改動一次模板都會立即重新生成一份可編譯的 Java Client作為文檔可消費性的即時驗證。階段 4針對生成客戶端的冒煙測試測試代碼位于 engine-rest/engine-rest-openapi/src/test使用WireMock對生成的客戶端做冒煙測試例如DeploymentTest.java部署相關端點ProcessInstanceTest.java流程實例相關端點BasicAuthenticationTest.java基礎認證流程這些測試用 WireMock 模擬真實 REST 服務再通過生成的 Java Client 發(fā)起調(diào)用從而驗證OpenAPI 文檔 → 客戶端 → 實際 HTTP 語義整條鏈路的正確性。pom 中的swagger-annotations、okhttp、gson、gson-fire、jsr305、commons-lang3等依賴正是生成客戶端運行所需的支撐庫。三、模板目錄結構文檔的源代碼OpenAPI 文檔本身是產(chǎn)物FreeMarker 模板才是真正的源代碼。原文檔給出的模板結構如下對應 src/main/templates 目錄--main.ftl --lib | --utils.ftl | --commons | | --pagination-params.ftl | | --process-instance-query-params.ftl | | --sort-params.ftl | | --sort-props.ftl --models | --org/camunda/bpm/engine/rest/dto | | --ExceptionDto.ftl | | --history | | | --HistoricProcessInstanceQueryDto.ftl | | --repository | | | --DeploymentDto.ftl | | | --ProcessDefinitionDto.ftl | | --runtime | | | --ActivityInstanceDto.ftl --paths | --deployment | | --create | | | --post.ftl | --process-instance | | --get.ftl | | --suspended | | | --put.ftl | | --{id} | | | --delete.ftl | | | --variables | | | | --{varName} | | | | | --data | | | | | | --get.ftl | | | | | | --post.ftl | | | | | --delete.ftl實際倉庫中的目錄比文檔示例更龐大lib/commons 下有約 40 個可復用模板task-query-params.ftl、historic-incident-query-params.ftl、statistics-query-params.ftl、deployment-query-params.ftl等paths 下按資源組織了幾十個子目錄authorization、batch、deployment、execution、external-task、history、process-instance、process-definition、task等models/org/camunda/bpm/engine/rest/dto 下有約 195 個 DTO 模板。各部分的職責劃分如下目錄/文件職責main.ftlOpenAPI 文檔頂層骨架版本、info、servers、tags、paths、componentslib/utils.ftl全部宏macro的定義路徑與模型模板共同使用lib/commons/*.ftl可復用的參數(shù)/屬性片段分頁、排序、各類查詢參數(shù)models/...請求/響應體引用的 DTO 定義目錄結構與 Java 包名對齊paths/...每個 REST 端點的操作定義目錄結構即 URL 路徑四、main.ftlOpenAPI 文檔的頂層骨架main.ftl 是模板解析的入口在 pom 中作為第二個參數(shù)傳給TemplateParser。它負責輸出 OpenAPI 3.0.2 文檔的全局信息openapi 版本固定輸出openapi: 3.0.2info標題Camunda Platform REST API、描述、版本${cambpmVersion}來自 Jar 包的ImplementationVersion、LicenseApache License 2.0externalDocs指向 Camunda REST API 參考文檔servers通過lib.server宏輸出三種服務端地址——默認引擎http://{host}:{port}/{contextPath}默認localhost:8080/engine-rest、命名引擎含/engine/{engineName}路徑變量、自定義 URL 服務器tags為每個資源定義一個標簽共 50 個左右如Authorization、Deployment、Process Instance、Task、Task Attachment、Task Comment、Task Identity Link、Historic Process Instance等。子資源必須使用父資源標簽作為前綴如Task與Task Attachmentpaths遍歷endpoints數(shù)據(jù)模型對每個 URL 路徑、每個 HTTP 方法導入對應的method.ftl并調(diào)用其endpoint_macrosecurity / components聲明basicAuthHTTP 基礎認證安全方案components/schemas遍歷models數(shù)據(jù)模型對每個 DTO 導入對應模板并調(diào)用其dto_macro。main.ftl還定義了文檔鏈接的基礎變量docsUrl https://docs.camunda.org/manual/${docsVersion}其中docsVersion由 TemplateParser.resolveVersions 根據(jù)包版本推導SNAPSHOT版本映射為developalpha版本映射為latest正式版本則取7.x前綴——這是模板內(nèi)大量 User guide 是整個生成體系的標準庫定義了路徑與模型模板中高頻使用的宏宏用途關鍵參數(shù)parameter生成查詢/路徑參數(shù)的 JSON 對象name、location、type、desc可選enumValues、defaultValue、format、required、lastparameters批量生成一組查詢參數(shù)object參數(shù)集合、skip跳過列表、lastproperty生成 DTO 屬性的 JSON 對象name、type可選format、nullable、enumValues、minimum、deprecated、itemType、dto、additionalProperties、addProperty、lastproperties批量生成一組屬性同上dto生成 DTO 的 schema 定義type、title、desc、required、extends觸發(fā)allOf繼承requestBody生成請求體mediaType、dto/flatType、requestDesc、examplesresponse生成 HTTP 響應對象code、desc可選dto、array、additionalProperties、mediaType、binary、examples、lastmultiTypeResponse生成多 content-type 的響應types數(shù)組server生成 server 對象url、variables、descendpointInfo生成操作的元信息idoperationId、tag、desc可選deprecated、summaryremoveIndentation函數(shù)壓縮描述中的多級縮進文本幾個需要重點理解的實現(xiàn)細節(jié)逗號,控制所有宏都以last參數(shù)控制 JSON 對象間的逗號輸出——最后一個條目傳last true時不輸出逗號其余輸出。這是保證最終 JSON 語法正確的關鍵約定原文檔反復強調(diào)不要遺漏。nullable 的默認策略property 宏 中當類型為boolean、string、array或帶有format、dto引用時nullable默認輸出nullable: true目的是兼容 C# 客戶端對字段是否可為 null的顯式聲明需求只有確定必填的屬性才通過nullable false關閉。typerefproperty宏支持type refdto xxx輸出$ref指向#/components/schemas/xxxarray與additionalProperties組合支持輸出items/additionalProperties的內(nèi)聯(lián)對象或$ref。204 響應response 宏 對204 No Content不生成content塊responseContentMediaType對application/xhtmlxml、二進制流等媒體類型輸出format: binary的字節(jié)流 schema。server 宏通過 FreeMarker 的#list variables as name, default遍歷輸出帶默認值的 URL 變量。原文檔特別提醒這些宏在路徑與模型模板中被大量使用建議先熟悉它們但如果某個端點/DTO 過于復雜不使用宏、手寫 JSON 也是允許的。宏缺少參數(shù)時可以直接補充但必須同步修改所有調(diào)用點。部分參數(shù)是強制的多數(shù)場景下的name與description部分是可選的錦上添花參數(shù)minimum、defaultValue、deprecated。六、modelsDTO 定義的編寫規(guī)范models目錄存放請求/響應體中出現(xiàn)的所有 DTO且遵循以下約定命名與包結構對齊 Java DTO例如 Java 類org.camunda.bpm.engine.rest.dto.ExceptionDto.java位于 engine-rest/engine-rest/src/main/java/org/camunda/bpm/engine/rest/dto/ExceptionDto.java對應模板 models/org/camunda/bpm/engine/rest/dto/ExceptionDto.ftl保持 OpenAPI 屬性與 Java DTO 盡可能一致當某屬性對特定端點不適用時在端點描述中顯式說明例如 process-instance/suspended/put.ftl 中ProcessInstanceSuspensionStateDto的historicProcessInstanceQuery屬性在批量暫停場景的適用性說明。模型自動解析TemplateParser.resolveModels()遞歸掃描models目錄從文件路徑中的org包名截取包路徑模型按名稱字典序自動排序。因此/models目錄只放文檔中實際用到的模型宏與可復用片段必須放進lib/commons禁止創(chuàng)建空目錄。用dto宏定義模型所有 DTO 模板都應通過dto宏包裹property宏。對于存在繼承關系的 DTO如TriggerVariableValueDto extends VariableValueDtodto宏的extends屬性會生成 OpenAPI 的allOf語法。倉庫示例 TriggerVariableValueDto.ftl#macro dto_macro docsUrl lib.dto extends VariableValueDto lib.property name local type boolean last true desc Indicates whether the variable should be a local variable or not. If set to true, the variable becomes a local variable of the execution entering the target activity. / /lib.dto /#macro渲染后即生成{allOf: [ {...本地屬性...}, {$ref: #/components/schemas/VariableValueDto} ]}。響應可能是兩種 DTO 的情況當響應的具體 DTO 取決于請求參數(shù)時如消息關聯(lián)MessageCorrelationResultDto與其子類MessageCorrelationResultWithVariableDto建議直接使用包含全部屬性的那個 DTO 作為響應 schema并明確記錄哪些屬性在哪些場景不適用。原文檔提示某些場景可考慮oneOfdiscriminatorOpenAPI 3.0.2 支持但必須額外測試因為部分客戶端生成器對該寫法支持不佳。不要忘記last true每個property宏的最后一個屬性必須傳last true由宏負責 JSON 逗號。含排序/分頁的 DTO應復用lib/commons中的公共模板見下文。七、paths端點定義的編寫規(guī)范paths目錄存放 REST API 全部端點的操作定義核心規(guī)則如下目錄結構即 URL 路徑每個資源一個文件夾如/paths/process-instance、/paths/deployment。端點路徑由目錄自動推導——GET /process-instance/count對應/paths/process-instance/count/get.ftl。因此必須保持/paths目錄干凈除端點定義外不放任何多余文件可復用片段一律進lib/commons同樣禁止空目錄端點路徑按字典序自動排序。HTTP 方法即模板文件名get.ftl、post.ftl、put.ftl、delete.ftl、options.ftl原文檔示例中寫為post.frl系筆誤實際為post.ftl。動態(tài)路徑參數(shù)動態(tài)端點用花括號目錄表達如process-instance/{id}/variables/{varName}/data且路徑參數(shù)id、varName必須出現(xiàn)在端點定義中并標記為required通過parameter宏的location path與required true。operationId 唯一每個端點定義必須有唯一的operationId它直接用于客戶端生成。大多數(shù)情況下直接采用 Java 方法名如deleteProcessInstancesAsync無法采用時按 Java 命名規(guī)范自定義。async 端點的 C# 碰撞規(guī)避對異步端點在operationId后追加Operation后綴防止 C# 客戶端生成時與同步方法沖突。原文檔示例setExternalTaskRetriesAsync→setExternalTaskRetriesAsyncOperationmodifyProcessInstanceAsync→modifyProcessInstanceAsyncOperation。相似端點拆分路徑不同但幾乎相同的端點如獲取活動實例統(tǒng)計在不同資源下的變體必須拆分為不同文件并各自分配唯一operationId公共部分可抽到lib/commons。必填的內(nèi)容要素每個端點必須包含——所屬資源的tag如Process instance、Deploymentdescription與summarysummary 通常對應 REST API 文檔頁標題至少一個 HTTP 響應對象請求體盡量使用 DTO始終先查看對應 Java DTO 的字段避免只靠端點描述拼湊無 DTO 的請求體。以 process-instance/suspended/put.ftl 為完整范例可以看到endpointInforequestBody帶 3 個示例responses204 與 400ExceptionDto的典型組合#macro endpoint_macro docsUrl { lib.endpointInfo id updateSuspensionState tag Process Instance summary Activate/Suspend In Group desc Activates or suspends process instances by providing certain criteria: ... / lib.requestBody mediaType application/json dto ProcessInstanceSuspensionStateDto examples [example-1: { summary: PUT /process-instance/suspended, description: Suspend Process Instance By Process Definition Id, value: { processDefinitionId : aProcDefId, suspended : true } }, ...] / responses : { lib.response code 204 desc Request successful./ lib.response code 400 dto ExceptionDto last true desc Bad Request .../ } } /#macro八、commons排序、分頁與復用lib/commons存放可復用的公共模板原文檔重點介紹了三類1. 排序sortingsort-params.ftlsort-props.ftl使用方式先assign一個sortByValues枚舉列表再#include對應模板若該排序?qū)傩允亲詈笠粋€參數(shù)/屬性還需取消注釋last true。原文檔示例#-- #assign last true -- #-- remove comment if last param -- #assign sortByValues [instanceId, definitionId, definitionKey, definitionName, definitionVersion, businessKey, startTime, endTime, duration, tenantId] #include /lib/commons/sort-props.ftl 從 sort-props.ftl 的實現(xiàn)可以看到該模板輸出sortBy枚舉來自sortByValues與sortOrder枚舉固定為asc/desc兩個屬性若傳了sortParamsDto還會追加一個parameters引用屬性。模板注釋解釋了設計緣由sortBy的取值必須動態(tài)定義且不同 Query 端點的排序?qū)傩约喜煌虼瞬荒軐懰涝赿to宏里而必須顯式#include。2. 分頁paginationpagination-params.ftl只要端點參數(shù)包含firstResult與maxResults就應使用它。從 pagination-params.ftl 的實現(xiàn)可見它輸出兩個integer類型的查詢參數(shù)firstResult返回結果的起始索引與maxResults最多返回條數(shù)超出時返回較少結果。使用方式同樣是先設定last再 include#-- #assign last true -- #-- remove comment if last param -- #include /lib/commons/pagination-params.ftl 3. 復用reuse當同一組參數(shù)在多個端點反復出現(xiàn)時可自定義模板并復用。原文檔給出的范例是 process-instance-query-params.ftl被getProcessInstancesCount與getProcessInstances兩個端點共同引用。倉庫中這樣的模板非常多例如task-query-params.ftl、external-task-query-params.ftl、historic-process-instance-query-params.ftl、authorization-query-params.ftl、deserialize-values-parameter.ftl等它們保證了同類查詢端點參數(shù)描述的一致性。九、描述、格式、可空性與示例寫作文檔的四個關鍵規(guī)范1. 描述文本Descriptions描述支持 Markdown 語法monospace代碼、*italic*/_italic_斜體、**bold**/__bold__粗體、* bullet point列表。文本規(guī)范包括使用Unix 換行符LF鏈接使用 Markdown 語法通過${docsUrl}變量解析官方文檔鏈接docsUrl在main.ftl中定義為https://docs.camunda.org/manual/${docsVersion}例如User guide單行長度不超過120 字符使用縮進與換行拆分長描述提升可讀性模板渲染時會由removeIndentation函數(shù)統(tǒng)一壓縮縮進。原文檔示例流程實例修改指令端點description: Submits a list of modification instructions to change a process instances execution state. A modification instruction is one of the following: * Starting execution before an activity * Starting execution after an activity on its single outgoing sequence flow * Starting execution on a specific sequence flow * Canceling an activity instance, transition instance, or all instances (activity or transition) for an activity Instructions are executed immediately and in the order they are provided in this requests body. Variables can be provided with every starting instruction. The exact semantics of modification can be read about in the [User guide](https://docs.camunda.org/manual/develop/user-guide/process-engine/process-instance-modification/).2. 格式Formatsformat字段進一步限定屬性/參數(shù)的類型語義詳見 OpenAPI 3.0.2 規(guī)范的dataTypeFormat。本倉庫文檔常用的格式為int32、binary、date-time。例如日期屬性一律標注date-time格式lib.property name startedBefore type string format date-time description Restrict to instances that were started before the given date. By default (https://docs.camunda.org/manual/${docsVersion}/reference/rest/overview/date-format/), the date must have the format yyyy-MM-ddTHH:mm:ss.SSSZ, e.g., 2013-01-23T14:42:45.0000200. /標注format能顯著提升生成客戶端的可用性。特別注意當date-time出現(xiàn)在 GET 請求的 URL 參數(shù)中時必須按 Camunda 的日期格式約定做正確的 URL 編碼。3. 可空性Nullable默認情況下boolean、string、array、dto類型的屬性會自動開啟nullable: true以生成對 C# 客戶端更友好的寬松規(guī)范字段是否可為 null 由客戶端顯式聲明。只有在確定必填的屬性上才顯式關閉lib.property name version type integer format int32 nullable false desc The version of the process definition that the engine assigned to it. /4. 示例ExamplesrequestBody與response宏都支持examples參數(shù)約定如下示例內(nèi)容用單引號包裹而非雙引號因為示例內(nèi)包含引號需要轉義允許多個示例每個示例是examples數(shù)組中的一個獨立 JSON 對象如example-1、example-2每個示例必須有唯一名稱可添加description與/或summaryvalue屬性必填承載示例內(nèi)容。原文檔示例為SetJobRetriesByProcessDto請求體配置示例并說明historicProcessInstanceQuery在該場景下是 Unallowed propertylib.requestBody mediaType application/json dto SetJobRetriesByProcessDto requestDesc Please note that if both processInstances and processInstanceQuery are provided, then the resulting execution will be performed on the union of these sets. **Unallowed property**: historicProcessInstanceQuery examples [example-1: { value: { retries: numberOfRetries, processInstances: [aProcess, secondProcess], processInstanceQuery: { processDefinitionId: aProcessDefinitionId } } }/十、Reviews模板變更的質(zhì)量評審清單由于 OpenAPI 文檔是由目錄結構與模板間接推導的錯誤的路徑、缺失的響應、不規(guī)范的 operationId 都不易直接察覺因此原文檔給出了一套評審Review清單宏變更回歸若修改了utils.ftl中的宏請將上次構建的openapi.json與本次待評審版本做對比確保所有端點在新宏下仍然完整核對端點路徑路徑由目錄結構推導肉眼不易發(fā)現(xiàn)錯誤必須逐條額外核對核對參數(shù)、請求與響應確保參數(shù)、請求體、響應對象正確與 Java 端點對齊operationId應盡可能貼近 DTO 包中對應的 Java 方法對照*RestService.java與*Resource.java接口如 engine-rest/engine-rest/src/main/java 下的實現(xiàn)客戶端對比可將構建階段生成的客戶端與真實 REST API 對比多數(shù)情況下兩者應該高度相似。十一、從模板到可發(fā)布產(chǎn)物的閉環(huán)綜合來看camunda-engine-rest-openapi模塊形成了一條完整的文檔即代碼閉環(huán)貢獻者按規(guī)范在paths、models、lib/commons中編寫/修改 FreeMarker 模板mvn clean install時TemplateParser基于目錄結構自動推導端點路徑與模型清單渲染出openapi.jsonSchemaValidator用 OpenAPI 3.0 官方 schema 本地副本校驗結構合法性非法即構建失敗openapi-generator-maven-plugin依據(jù) openapi.json 生成 Java Client 源碼WireMock JUnit 冒煙測試驗證客戶端行為DeploymentTest、ProcessInstanceTest、BasicAuthenticationTest等生成的 openapi.json 同時作為模塊資源build-helper-maven-plugin將其加入資源目錄隨制品發(fā)布供下游工具消費。這一體系的價值在于REST API 文檔不再是與實現(xiàn)脫節(jié)的靜態(tài)文件而是與端點源碼、DTO 結構嚴格對齊、且每輪構建都被機器驗證的活文檔。對于需要為 Camunda Platform 擴展自定義 REST 端點、或希望理解大型項目如何用模板化方式維護 OpenAPI 規(guī)范的開發(fā)者engine-rest/engine-rest-openapi是一份極具參考價值的實現(xiàn)樣本——其模板組織方式、宏抽象粒度、公共片段復用策略與生成—校驗—生成客戶端—冒煙測試的構建編排都可以直接遷移到同類項目中復用?!久赓M下載鏈接】camunda-bpm-platformCamunda 7 CE is End of Life (EoL). Please check out Camunda 8 instead (https://github.com/camunda/camunda) or read about Camunda 7 Enterprise End of Life (https://camunda.com/blog/2025/02/camunda-7-enterprise-end-of-life-extension/) – Camunda 7 CE was a flexible framework for workflow and decision automation using BPMN and DMN.項目地址: https://gitcode.com/GitHub_Trending/ca/camunda-bpm-platform創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考