提问者:小点点

在表达式中引用任务局部变量(active iti 5.16.3)


我有一个从userTask1到userTask2的条件转换(它们是我在bpmn中定义的任务的id)。

我在bpmn文件中使用了以下表达式:

<conditionExpression xsi:type="tFormalExpression"><![CDATA[${userTask1.varA == "uTask2"}]]></conditionExpression>

当我将userTask1标记为“已完成”时,我在JavaAPI中使用以下方法:

Map variableMap = new HashMap();
variableMap.put("varA", "1");
activitiRule.getTaskService().complete(tasks.get(0).getId(), variableMap, true);

注意最后的“true”参数,这是说这些变量是任务的本地变量。

在单独的测试中,我可以验证变量是否确实存储在任务的本地。

但是,在这个测试中(使用条件转换),我得到了这个错误:

org.activiti.engine.ActivitiException: Unknown property used in expression: ${userTask1.varA == "uTask2"}
at org.activiti.engine.impl.el.JuelExpression.getValue(JuelExpression.java:53)
...
Caused by: org.activiti.engine.impl.javax.el.PropertyNotFoundException: Cannot resolve identifier 'userTask1'

这个怎么解决?

谢谢拉卡


共1个答案

匿名用户

Activiti中的每个执行都有变量,嵌套执行可以看到父变量,不代表相反的方向。问题是你在当前执行的局部范围内声明变量,这样只有执行才能看到它。你可以避免,如果你将变量绑定到流程实例范围,流程实例只不过是另一个执行,但它是所有其他执行的根/父执行(调用活动除外)。

执行就像一系列计划执行的元素,我敢将其与java的线程进行比较,但更抽象,并且在持久化状态下,执行可以有嵌套执行。有许多元素会创建新的执行;并行/包容网关、边界/即时事件、调用活动、子流程…我认为完成用户任务也会开始新的执行。

您可以在数据库表act_ru_execution和表中的变量中轻松检查您的执行情况act_ru_variable,变量在执行时具有FK。

希望有帮助。