cancel
Showing results for 
Search instead for 
Did you mean: 

Referring to task local variable in expression (activiti 5.16.3)

raka
Champ in-the-making
Champ in-the-making
Hi,

I have a conditional transition from userTask1 to userTask2. My tasks definition:

<userTask id="userTask1" name="User Task 1" activitiSmiley Surprisedwner="kermit">
      <extensionElements>
        <activiti:formProperty id="varA" name="varA" type="string"/>
      </extensionElements>
    </userTask>
    <userTask id="userTask2" name="User Task 2" activitiSmiley Surprisedwner="piggy">
      <extensionElements>
        <activiti:formProperty id="varB" name="varB" type="string"/>
      </extensionElements>
    </userTask>

I used the following expression in the bpmn file: <conditionExpression xsi:type="tFormalExpression"><![CDATA[${userTask1.varA == "uTask2"}]]></conditionExpression>

When I mark the userTask1 as "completed", I use the following method in the Java API:


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


Notice the "true" param at the end, this is to say that those variables are local to the task.

In a separate test I could verify that the the variable is indeed stored locally to the task.

But, in this test (with the conditional transition), I'm getting this error:

—-
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'
—-

How to solve this?

Thanks,
Raka
3 REPLIES 3

raka
Champ in-the-making
Champ in-the-making
Sorry, looks like my XML snippet was automatically removed. It was for my task definition. I have 2 user tasks whose id is: userTask1 and userTask2

martin_grofcik
Confirmed Champ
Confirmed Champ
Hi,

I would add only one note to the answer in stackoverflow.
Have a look on the following jUnit tests in activiti source:


  public void testCompleteWithTaskLocalParameters() {
   ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testTaskLocalVars");

    // Fetch first task
    Task task = taskService.createTaskQuery().singleResult();

    // Complete first task
    Map<String, Object> taskParams = new HashMap<String, Object>();
    taskParams.put("a", 1);
    taskParams.put("b", 1);
    taskService.complete(task.getId(), taskParams, true);
   
    // Verify vars are not stored process instance wide
    assertNull(runtimeService.getVariable(processInstance.getId(), "a"));
    assertNull(runtimeService.getVariable(processInstance.getId(), "b"));
   
    // verify script listener has done its job
    assertEquals(new Integer(2), runtimeService.getVariable(processInstance.getId(), "sum"));

    // Fetch second task
    taskService.createTaskQuery().singleResult();

  }


  @Deployment(resources = {
    "org/activiti/engine/test/api/twoTasksProcess.bpmn20.xml" })
  public void testCompleteWithParametersTask() {
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("twoTasksProcess");

    // Fetch first task
    Task task = taskService.createTaskQuery().singleResult();
    assertEquals("First task", task.getName());

    // Complete first task
    Map<String, Object> taskParams = new HashMap<String, Object>();
    taskParams.put("myParam", "myValue");
    taskService.complete(task.getId(), taskParams);

    // Fetch second task
    task = taskService.createTaskQuery().singleResult();
    assertEquals("Second task", task.getName());

    // Verify task parameters set on execution
    Map<String, Object> variables = runtimeService.getVariables(processInstance.getId());
    assertEquals(1, variables.size());
    assertEquals("myValue", variables.get("myParam"));
  }

Regards
Martin