欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于Activiti5.22版本整合modler监听丢失解决办法

程序员文章站 2022-07-02 17:09:24
转载请注明出处:https://www.cnblogs.com/rolayblog/p/10444866.html 我当时遇到这个问题的时候很懵,各种度娘谷歌,始终找不到解决办法。无奈,只有断点跟源码一步一步的看,最终找到了问题所在。然后根据自己有限的思维和经验修改了,下面上代码。 在convert ......

转载请注明出处: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         }

然后再调用就能解析到监听了,如果大家有更好的方法,欢迎讨论。