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

