activiti获取流程图中的所有信息包括变量名

今天在看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

时间: 2024-10-29 19:11:52

activiti获取流程图中的所有信息包括变量名的相关文章

查找jar包中.class文件关键字(变量名,字符串)

有时查看日志,常常会发现由框架底层打印的错误日志.要修改这个错误的时候,如果不是对框架特别熟悉,就需要按照可能产生这个错误日志的流程一步一步找,一时半会不一定能找到.比如本人最近对smartfoxserver搭建的服务器做压测的时候,发现最大等待线程数超过20就会打印错误日志,然后就一直在smartfoxserver接受请求的反编译代码里找该错误输出,花了很长时间一直没找到.然后我在想能否用inputstream来查询字符串,试验代码如下: import java.io.BufferedRead

【Thinking In Java零散笔记】对于持有对象一章中的显示系统环境变量代码分析

今天仍旧进行着学习java的计划.在学习到持有对象一章中,看到了如下代码: 1 import java.util.*; 2 3 public class EnvironmentVariables { 4 public static void main(String[] args) { 5 for(Map.Entry entry: System.getenv().entrySet()) { 6 System.out.println(entry.getKey() + ": " + 7 en

解决ambiguous symbol命名空间中类名、变量名冲突的问题

最近在将一个复杂的工程集成到现有的项目中.编译时发现,有的变量名冲突了,提示就是xxxx ambiguous symbol,并且在编译输出时,指明了两个文件当中特定的变量名或者类名相同.出现这个编译错误的原因是,在工程中加载了两个头文件,这两个头文件中包含相同的类名或者变量名,解决及避免出现此类错误的方法如下: 代码库尽量包含在一个命名空间中.在我们写一个大的程序时,一些变量可能会与其他工程造成重名,所以加命名空间是很有必要的:另外,在自己的代码库中命名的类名变量名尽量以代码库的名称开头,这样大

C++入门经典-例6.9-通过指针变量获取数组中的元素

1:通过指针引用数组,需要先声明一个数组,再声明一个指针. int a[10]; int *p; 然后通过&运算符获取数组中元素的地址,再将地址值赋给指针变量. p=&a[0]; 代码实例如下: // 6.9.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void main() { int i,a[10]; int *p; //利用循环

Unity 获取场景中所有目标对象(包括不激活的对象)

using UnityEngine; using UnityEditor; using System.Collections.Generic; public class ExampleScript : MonoBehaviour { // 获取场景中所有目标对象(包括不激活的对象)不包括Prefabs: List<T> FindSceneObject<T>(string _SceneName)where T:UnityEngine.Component { List<T>

Java非递归的方式获取目录中所有文件(包括目录)

零.思路解析 对于给出的文件查看其下面的所有目录,将这个目录下的所有目录放入待遍历的目录集合中,每次取出该集合中的目录遍历,如果是目录再次放入该目录中进行遍历. 一.代码 /** * 非递归的方式获取目录中的所有文件<br> * 此方法获取的路径未按照目录->文件方式排列 * * @param dirPath 目录路径 * @return 指定目录下所有文件和目录的集合 */ public static List<File> listAllFile(String dirPat

Beetl通过JAVA接口获取JAVA中的变量

模板语言绑定变量都是程序主动绑定到beetl,经过努力现在在beetl上实现了模板语言主动发出请求,来执行绑定. 最近做项目用到beetl,因为模板需要用到的变量很多,如果直接绑定,系统消耗很大. 产生了一个想法,当beetl解析不到变量的时候,通过JAVA接口直接获取对象返回给BEETL继续进行解析. 最终实现了Beetl主动发起绑定变量的功能. 修改的代码见最后. 调用时的代码如下: StringTemplateResourceLoader resourceLoader = new Stri

Android中WebView获取网页中标题 ,内容, 图片的方法

如题,在Android中WebView获取网页中标题 ,内容, 图片的方法 首先是获取标题,在new WebChromeClient(){}中重写onReceivedTitle()方法 @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); // loge.e("__页面标题__"+title); } 获取内容,是参考的这边的 http

PHP获取Post的原始数据方法小结(POST无变量名)

From : http://blog.csdn.net/hotdigger/article/details/6456240 一般我们都用$_POST或$_REQUEST两个预定义变量来接收POST提交的数据.但如果提交的数据没有变量名,而是直接的字符串,则需要使用其他的方式来接收. 方法一: 使用全局变量$GLOBALS['HTTP_RAW_POST_DATA']来获取. 在$GLOBALS['HTTP_RAW_POST_DATA']存放的是POST过来的原始数据.而$_POST或$_REQUE