A-A+
Flowable6.4 – 扩展属性
本次分享一下节点扩展属性的相关知识。
首先,扩展属性在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<>());
}
以上,就是本次分享的内容,如有问题欢迎指正。
