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

如何通过Camunda Java API访问自定义BPMN扩展元素?

问题描述

我有一个包含如下扩展元素的BPMN文件:

<bpmn:extensionElements>
  <zeebe:taskDefinition type="customer-interaction-service" retries="0" />
  <zeebe:taskHeaders>
    <zeebe:header key="operation" value="save" />
    <zeebe:header key="@type" value="Organization[]" />
    <zeebe:header key="updateReliesOnReferredTypes" value="@Customer.engagedParty" />
  </zeebe:taskHeaders>
</bpmn:extensionElements>

我想要访问其中的header元素并获取键和值。我参考了CMMN自定义元素相关教程,但BPMN API并未注册我的自定义类。以下是关键代码片段:

主类代码

public class Main {
    public static void main(String[] args) {
        InputStream is = Main.class.getResourceAsStream("/dclm-addservice.bpmn");
        BpmnModelInstance model = CustomBpmn.readModelFromStream(is );
        ServiceTask serviceTask=model.getModelElementById("ServiceTask_1jn441o");
        int count=serviceTask.getExtensionElements().getElementsQuery().filterByType(TaskHeaders.class).count();
        System.out.println(count);
        count=serviceTask.getExtensionElements().getElementsQuery().count();
        System.out.println(count);
    }
}

运行结果:

0
2

按TaskHeaders.class过滤时结果为0。

CustomBpmn类代码

public class CustomBpmn extends Bpmn {
    public static CustomBpmn INSTANCE = new CustomBpmn();
    public CustomBpmn() {
        super();
        System.out.println("constructor");
    }
    @Override
    protected void doRegisterTypes(ModelBuilder modelBuilder) {
      super.doRegisterTypes(modelBuilder);
      System.out.println("registering");
      HeaderImpl.registerType(modelBuilder);
      TaskHeadersImpl.registerType(modelBuilder);
    }
}

Header接口代码

public interface Header extends BpmnModelElementInstance  {
    public String getKey();
    public void setKey(String key);
    public String getValue();
    public void setValue(String value);
}

TaskHeaders接口代码

public interface TaskHeaders extends BpmnModelElementInstance {
    Collection<Header> getHeaders();
    void addHeader(Header header);
    boolean addHeaders(List<Header> headers);
    List<Header> findByKey(String key);
}

HeaderImpl类代码

public class HeaderImpl extends BpmnModelElementInstanceImpl implements Header {
    protected static Attribute<String> keyAttribute;
    protected static Attribute<String> valueAttribute;
    public static void registerType(ModelBuilder modelBuilder) {
        ModelElementTypeBuilder typeBuilder = modelBuilder.defineType(Header.class, HEADER)
                .namespaceUri(ZEEBE_SCHEMA)
                .instanceProvider(new ModelTypeInstanceProvider<Header>() {
                    public Header newInstance(ModelTypeInstanceContext instanceContext) {
                        return new HeaderImpl(instanceContext);
                    }
                });
        keyAttribute =typeBuilder.stringAttribute(KEY_NAME)
                .namespace(ZEEBE_SCHEMA)
                .build();
        valueAttribute =typeBuilder.stringAttribute(VALUE_NAME)
                .namespace(ZEEBE_SCHEMA)
                .build();
        typeBuilder.build();
    }
    public HeaderImpl(ModelTypeInstanceContext instanceContext) {
        super(instanceContext);
    }

// some getter and setters.
}

TaskHeadersImpl类代码

public class TaskHeadersImpl extends BpmnModelElementInstanceImpl implements TaskHeaders {
    protected static ChildElementCollection<Header> headerCollection;
    public static void registerType(ModelBuilder modelBuilder) {
        ModelElementTypeBuilder typeBuilder = modelBuilder.defineType(TaskHeaders.class, TASK_HEADERS)
                .namespaceUri(ZEEBE_SCHEMA)
                .instanceProvider(new ModelTypeInstanceProvider<TaskHeaders>() {
                    public TaskHeaders newInstance(ModelTypeInstanceContext instanceContext) {
                        return new TaskHeadersImpl(instanceContext);
                    }
                });
        SequenceBuilder sequenceBuilder = typeBuilder.sequence();
        headerCollection =sequenceBuilder.elementCollection(Header.class)
                .build();
        typeBuilder.build();
    }
    public TaskHeadersImpl(ModelTypeInstanceContext instanceContext) {
        super(instanceContext);
    }

// some getter and setters.
}

补充说明:我可以通过Zeebe Java API访问TaskHeaders,但上述问题仍需解决——因为TaskHeaders对于Zeebe建模器Java API并非自定义BPMN元素,但对于Camunda来说属于自定义扩展。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:50:55