当前位置 博文首页 > 程序员石磊:activiti获取用户任务同时查询流程变量 null pointe

    程序员石磊:activiti获取用户任务同时查询流程变量 null pointe

    作者:[db:作者] 时间:2021-08-08 22:23

    我用的activiti版本是 5.13
    先上代码:

    /**
         * 查询用户任务
         * @param userId
         * @return
         */
        public List<Task> getTasksByUserId(String userId){
            TaskQuery query = taskService.createTaskQuery().taskCandidateUser(userId).includeProcessVariables();//同时查询流程变量
            return query.orderByTaskCreateTime().desc().list();
        }

    如果您用

     task.getProcessVariables().get("faultId");

    如果流程变量里面有不是基本类型的变量,例如你之前保存了一个实体,就会报null pointer异常,很奇怪。经过看源代码:

    /**
     * @author Tom Baeyens
     * @author Joram Barrez
     * @author Falko Menge
     * @author Tijs Rademakers
     */ 
    public class TaskEntity extends VariableScopeImpl implements Task, DelegateTask, Serializable, PersistentObject, HasRevision {
      public Map<String, Object> getProcessVariables() {
        Map<String, Object> variables = new HashMap<String, Object>();
        if (queryVariables != null) {
          for (VariableInstanceEntity variableInstance: queryVariables) {
            if (variableInstance.getId() != null && variableInstance.getTaskId() == null) {
              variables.put(variableInstance.getName(), variableInstance.getValue());
            }
          }
        }
        return variables;
      }

    会发现在循环中,如果VariableInstanceEntity 保存的不是基本数据类型,variableInstance.getValue()就会出现null pointer异常**,具体为什么报异常也没有深入研究,但是我提出了一个解决办法供大家参考:

     List<VariableInstanceEntity> variableInstanceEntityList =  ((TaskEntity)task).getQueryVariables();
                     Object faultIdOb = getProcessVariable(variableInstanceEntityList,"faultId");
      /**
         * 获取流程变量
         * @param variableInstanceEntityList
         * @param variableName 流程变量名
         * @return
         */
        public Object  getProcessVariable(  List<VariableInstanceEntity> variableInstanceEntityList,String variableName ){
            for (VariableInstanceEntity variableInstance: variableInstanceEntityList) {
                if (variableInstance.getId() != null && variableInstance.getTaskId() == null) {
                    if(variableInstance.getName().equals(variableName))
                        return  variableInstance.getValue();
                }
            }
            return null;
        }

    这样就绕过了读取非基本类型变量 的值,也不会报错了。

    cs