今天在看activiti的变量的时候,都是由用户来设置变量,我们在后台写代码通过变量设置或取一些参数的时候,非常的不方便。
比如:设置变量的时候通过页面设置
设置之后,我们如何动态的给这个变量设置参数,我参考了好多资料,大部分都是直接进行的设置,比如:
Map<String, Object> variables = new HashMap<String, Object>(); variables.put("userIDs", "大大,中中,小小");
这样子的话就相当于把变量名设置死了,非常的不方便。那我们能不能动态的获取这个变量名,然后进行设参和取参呢?下面我们举个例子来详解:
在activti中有一个对象Process,封装了全部的节点、连线、以及关口等信息。我们可以通过这个对象获取流元素信息process.getFlowElements();
比如我们上面在一个任务节点中设置了一个用户组的变量,如何来获取这个变量呢,下面上代码
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #4f76cb }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #777777 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #7e504f }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #4e9072 }
span.s1 { color: #91afcb }
span.s2 { color: #000000 }
span.s3 { color: #931a68 }
span.s4 { color: #3933ff }
span.s5 { color: #7e504f }
span.s6 { color: #0326cc }
span.Apple-tab-span { white-space: pre }
/** * 获取流程图中的所有信息包括变量名 * @param processDefinitionId */ @Test public void a() { String processDefinitionId = "这里是流程定义ID"; Map<String,Object> map = new HashMap<String,Object>(); //获取bpmnModel对象 BpmnModel model1 = repositoryService.getBpmnModel(processDefinitionId); // BpmnModel model1 = new BpmnJsonConverter().convertToBpmnModel(modelNode); //由于我们这里仅仅定义了一个Process 所以获取集合中的第一个就可以 //Process对象封装了全部的节点、连线、以及关口等信息。拿到这个对象就能够为所欲为了。 Process process = model1.getProcesses().get(0); //获取全部的FlowElement(流元素)信息 Collection<FlowElement> flowElements = process.getFlowElements(); for (FlowElement flowElement : flowElements) { //假设是开始节点 if(flowElement instanceof StartEvent){ StartEvent startEvent = (StartEvent)flowElement; map.put("startEvent", startEvent); } //假设是任务节点 if(flowElement instanceof UserTask) { UserTask userTask = (UserTask)flowElement; List<String> candidateUsers = userTask.getCandidateUsers(); for (String string : candidateUsers) { System.out.println("-------"+string); } map.put("userTask", userTask); } //假设是结束节点 if(flowElement instanceof EndEvent) { EndEvent endEvent = (EndEvent)flowElement; map.put("endEvent", endEvent); } //假设是连接线 if(flowElement instanceof SequenceFlow) { SequenceFlow sequenceFlow = (SequenceFlow) flowElement; map.put("sequenceFlow", sequenceFlow); } } }
定义了一个map,把所有的节点对象都存入进去,每个节点对象中都封装了各自节点的全部信息,这些信息都对应着我们部署的xml文件,我们在进行调用的时候想用哪个对象就用哪个对象,这样子是不是很方便,来看一下运行代码的结果,是否会输出获取到的任务节点的变量名:
-------#{UserIds} -------#{UserIds}
获取到了,没问题,因为我在两个任务节点上都设置了相同的变量名所有出现了2次。其余的变量设置也是一样的,这里就只演示一下任务的变量名,其他的信息获取也是一样的,都在对象中包括咯。
这样子的话,我们以后在设置变量信息或者取的时候,就直接就可以获取到变量名来操作,是不是很灵活了。
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #4e9072 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco }
span.s1 { color: #7e504f }
原文地址:https://www.cnblogs.com/shijianhenjinpo/p/9240182.html