Activiti执行报错:javax.el.PropertyNotFoundException问题求助
Activiti流程变量无法识别问题排查与解决
问题原因
- 变量存储范围错误:User Task中把属性存在了任务局部变量(Task Local Variables),而非流程实例变量(Process Instance Variables),Exclusive Gateway只能读取流程实例级别的变量。
- 变量名不匹配:Condition里配置的变量名和实际存入的变量名存在大小写、拼写差异,EL表达式对变量名大小写敏感。
- Service Task变量丢失:Service Task处理过程中未将变量重新存入流程实例,或者处理逻辑覆盖/删除了该变量。
- EL表达式语法错误:Condition中的表达式写法有误,比如变量名包裹错误、运算符使用不当,导致引擎无法解析。
解决步骤
1. 确保变量存入流程实例级别
在User Task的业务逻辑中,使用流程实例的变量存储方法,而非任务局部变量:
// 正确设置流程实例变量,网关可直接访问 execution.setVariable("approvalStatus", "pass");
避免使用task.setVariableLocal(),该方法仅将变量绑定到当前User Task,后续节点无法读取。
2. 严格核对变量名称
检查Exclusive Gateway的Condition规则,确保变量名和代码中设置的完全一致。比如代码里存的是approvalStatus,Condition里就不能写成ApprovalStatus或approval_status。
3. 检查Service Task的变量处理
如果Service Task需要对该变量做处理,处理完成后务必重新存入流程实例:
// 在Service Task的JavaDelegate实现中处理变量 public class MyServiceTask implements JavaDelegate { @Override public void execute(DelegateExecution execution) { String status = (String) execution.getVariable("approvalStatus"); // 业务处理逻辑 String newStatus = status.equals("pass") ? "processed" : "rejected"; // 重新存入流程实例 execution.setVariable("approvalStatus", newStatus); } }
4. 修正EL表达式写法
Condition中的EL表达式要符合规范,示例正确写法:
${approvalStatus == 'pass'}
避免多余的引号、错误的比较运算符(比如用=代替==)。
5. 调试验证变量存在性
可以通过API或Activiti管理工具查看流程实例的变量情况,确认变量是否存在:
// 用RuntimeService获取流程实例变量 Map<String, Object> vars = runtimeService.getVariables(processInstanceId); System.out.println("当前流程变量:" + vars);
也可以在Activiti Modeler的流程实例详情中查看变量列表,确认变量是否正确存储。
内容的提问来源于stack exchange,提问作者Atul
相关产品推荐
相关产品推荐

