關於Activiti5.22版本整合官方modler監聽丟失解決辦法


轉載請注明出處:https://www.cnblogs.com/rolayblog/p/10444866.html 

我當時遇到這個問題的時候很懵,各種度娘谷歌,始終找不到解決辦法。無奈,只有斷點跟源碼一步一步的看,最終找到了問題所在。然后根據自己有限的思維和經驗修改了,下面上代碼。

1 Model modelData = repositoryService.getModel(modelId);
2 repositoryService.saveModel(modelData);
3 ObjectNode modelNode = (ObjectNode) new ObjectMapper()
4                     .readTree(repositoryService.getModelEditorSource(modelData.getId()));
5 BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);

在convertToBpmnModel的386行有如下代碼片段

1     // boundary events only contain attached ref id
2     for (Process process : bpmnModel.getProcesses()) {
3       postProcessElements(process, process.getFlowElements());
4     }

斷點調試process.getFlowElements()中可以看到此時監聽已經沒有了,問題就在這里,需要我們自己來解析一次監聽,下面是我自己寫的,只解析了taskListeners,如有需要可自行擴展添加。

 1 private Collection<FlowElement> addLostListenter(Collection<FlowElement> elements, ArrayNode shapesArrayNode) {
 2         Collection<FlowElement> newelements=new ArrayList<>();
 3         for (FlowElement flowElement : elements) {
 4 
 5             JsonNode thenode = null;
 6             // 查找bpmn節點對應的xml節點
 7             for (JsonNode node : shapesArrayNode) {
 8                 JsonNode properties = node.get(EDITOR_SHAPE_PROPERTIES);
 9                 if (properties != null) {
10                     JsonNode overrideidnode = properties.get(PROPERTY_OVERRIDE_ID);
11                     if (overrideidnode != null) {
12                         if (StringUtils.isNotEmpty(overrideidnode.asText())) {
13                             if (overrideidnode.asText().equals(flowElement.getId())) {
14                                 thenode = node;
15                                 // 找到當前對應的xml節點跳出
16                                 break;
17                             }
18 
19                         } else {
20                             String resourceId = node.get(EDITOR_SHAPE_ID).asText();
21                             if (StringUtils.isNotEmpty(resourceId)) {
22                                 if (resourceId.equals(flowElement.getId())) {
23                                     thenode = node;
24                                     // 找到當前對應的xml節點跳出
25                                     break;
26                                 }
27 
28                             }
29                         }
30 
31                     } else {
32                         String resourceId = node.get(EDITOR_SHAPE_ID).asText();
33                         if (StringUtils.isNotEmpty(resourceId)) {
34                             if (resourceId.equals(flowElement.getId())) {
35                                 thenode = node;
36                                 // 找到當前對應的xml節點跳出
37                                 break;
38                             }
39                         }
40 
41                     }
42                 }
43             }
44             if (thenode != null&flowElement.getClass().equals(UserTask.class)) {
45                 // 獲取tasklisteners節點
46                 
47                 FlowElement newflowelement= addTaskListenerToflowElement(flowElement,thenode);
48                 newelements.add(newflowelement);
49             }else
50             {
51                 newelements.add(flowElement);
52             }
53         }
54         return newelements;
55     }

然后更改386行處的代碼如下:

1 // boundary events only contain attached ref id
2         for (Process process : bpmnModel.getProcesses()) {
3 
4             Collection<FlowElement> elements = process.getFlowElements();
5             Collection<FlowElement> newelements=addLostListenter(elements, shapesArrayNode);
6             postProcessElements(process, newelements);
7         }

然后再調用就能解析到監聽了,如果大家有更好的方法,歡迎討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM