本次分享一下节点扩展属性的相关知识。
首先,扩展属性在XML文件中的表现形式,可以参见下图:
上图中红框部分,就是被添加的自定义属性。
如何增加自定义属性?
主要代码如下:
if (flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
ExtensionElement extensionElement = new ExtensionElement();
extensionElement.setName("user-task-expansion");
extensionElement.setNamespacePrefix("my");
extensionElement.setNamespace(BpmnJsonConverter.MODELER_NAMESPACE);
extensionElement.setElementText("11111");
userTask.addExtensionElement(extensionElement);
}复制
如果不清楚FlowElement的查找,可以参见《Flowable6.4 - BpmnModel》。
如何读取自定义属性?
主要代码如下:
if (flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
return userTask.getExtensionElements();
}复制
需要注意的是:如果按照以前分享的方法导出流程定义,或者查找FlowElement,会发现通过BpmnJsonConverter转化的Json不会包含这些自定义属性,因为自带的JsonConvert无法识别自定义扩展属性。
如果使用了自定义扩展属性,那么就需要重写BpmnJsonConvert和对应节点的Convert。比如,在本文中,就需要重写UserTaskJsonConvert。
完整代码如下(比较长,关键处做了注释):
public class ExtUserTaskJsonConverter extends UserTaskJsonConverter {
//固定写法,直接拷贝,注意更改节点类型对应的常量即可
static void customFillTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap, Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {
fillJsonTypes(convertersToBpmnMap);
fillBpmnTypes(convertersToJsonMap);
}
public static void fillJsonTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap) {
convertersToBpmnMap.put(STENCIL_TASK_USER, ExtUserTaskJsonConverter.class);
}
public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {
convertersToJsonMap.put(UserTask.class, ExtUserTaskJsonConverter.class);
}
//将Element转为Json
@Override
protected void convertElementToJson(ObjectNode propertiesNode, BaseElement baseElement) {
super.convertElementToJson(propertiesNode, baseElement);
if (baseElement instanceof UserTask) {
final String[] text = {""};
//读取自定义扩展属性
baseElement.getExtensionElements().forEach((s, elements) -> elements.forEach(extensionElement -> {
if ("user-task-expansion".equals(extensionElement.getName())) {
text[0] = extensionElement.getElementText();
}
}));
//在Json中增加一个属性
if (StrUtil.isNotBlank(text[0])) {
propertiesNode.put("usertaskexpansion", text[0]);
}
}
}
//将Json转为Element
@Override
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {
return super.convertJsonToElement(elementNode, modelNode, shapeMap);
}
//convertJsonToElement会调用此方法
@Override
protected void convertJsonToFormProperties(JsonNode objectNode, BaseElement element) {
super.convertJsonToFormProperties(objectNode, element);
if (element instanceof UserTask) {
//将Json转为UserTask中的Element
JsonNode userTaskExpansion = getProperty("usertaskexpansion", objectNode);
if (userTaskExpansion instanceof TextNode) {
if (StrUtil.isNotBlank(userTaskExpansion.toString())) {
addExpansionPropertiesElement((UserTask) element, (TextNode) userTaskExpansion);
}
}
}
}
private void addExpansionPropertiesElement(UserTask userTask, TextNode userTaskExpansion) {
ExtensionElement extensionElement = new ExtensionElement();
extensionElement.setName("user-task-expansion");
extensionElement.setNamespacePrefix("my");
extensionElement.setNamespace(BpmnJsonConverter.MODELER_NAMESPACE);
extensionElement.setElementText(userTaskExpansion.toString());
userTask.addExtensionElement(extensionElement);
}
}复制
自定义了节点的JsonConvert后,需要声明自己的BpmnConvert,并且将指定节点的JsonConvert替换。
public class ExtBpmnJsonConverter extends BpmnJsonConverter {
static {
convertersToBpmnMap.put(STENCIL_TASK_USER, ExtUserTaskJsonConverter.class);
ExtUserTaskJsonConverter.customFillTypes(convertersToBpmnMap, convertersToJsonMap);
}
}复制
经过上述扩展后,与自定义属性有关的功能才能够正常运行。
如何清除自定义属性?
主要代码如下:
if (flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
userTask.setExtensionElements(new HashMap<>());
}复制
以上,就是本次分享的内容,如有问题欢迎指正。
觉的不错?可以关注我的公众号↑↑↑
文章转载自字痕随行,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
2393次阅读
2025-04-09 15:33:27
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1107次阅读
2025-04-27 16:53:22
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
794次阅读
2025-04-10 15:35:48
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
610次阅读
2025-04-30 15:24:06
数据库,没有关税却有壁垒
多明戈教你玩狼人杀
552次阅读
2025-04-11 09:38:42
天津市政府数据库框采结果公布,7家数据库产品入选!
通讯员
536次阅读
2025-04-10 12:32:35
国产数据库需要扩大场景覆盖面才能在竞争中更有优势
白鳝的洞穴
521次阅读
2025-04-14 09:40:20
最近我为什么不写评论国产数据库的文章了
白鳝的洞穴
484次阅读
2025-04-07 09:44:54
一页概览:Oracle GoldenGate
甲骨文云技术
440次阅读
2025-04-30 12:17:56
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
438次阅读
2025-04-17 17:02:24