Activiti UEL 表达式

UEL表达式到底是什么呢?

UEL是java EE6规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method

Activiti使用UEL进行表达式解析(有关详细信息,请参阅EE6规范)

Activiti 如何使用UEL表达式获取Spring 容器中的bean?

答案在activiti-spring.jar中

SpringExpressionManager.java //spring表达式管理类

public class SpringExpressionManager extends ExpressionManager {//应用上下文protected ApplicationContext applicationContext;public SpringExpressionManager(ApplicationContext applicationContext, Map<Object, Object> beans) {super(beans);//这个beans是流程引擎中的beansthis.applicationContext = applicationContext;}@Overrideprotected ELResolver createElResolver(VariableScope variableScope) {//复合el表达式CompositeELResolver compositeElResolver = new CompositeELResolver();compositeElResolver.add(new VariableScopeElResolver(variableScope));//判断beans是否为空if (beans != null) {// 在表达式中只暴露流程引擎中的beanscompositeElResolver.add(new ReadOnlyMapELResolver(beans));} else {// 在表达式中暴露整个application-contextcompositeElResolver.add(new ApplicationContextElResolver(applicationContext));}//添加数组解析器compositeElResolver.add(new ArrayELResolver());//添加集合解析器compositeElResolver.add(new ListELResolver());//添加map解析器compositeElResolver.add(new MapELResolver());//添加json格式的数据解析器 like {key:value,...} or [1,2,3,4,...]compositeElResolver.add(new JsonNodeELResolver());//添加bean解析器compositeElResolver.add(new BeanELResolver());return compositeElResolver;}

在ProcessEngineConfigurationImpl.java中调用

public class ProcessEngineFactoryBean implements FactoryBean<ProcessEngine>, DisposableBean, ApplicationContextAware {...protected void configureExpressionManager() {if (processEngineConfiguration.getExpressionManager() == null && applicationContext != null) {processEngineConfiguration.setExpressionManager(new SpringExpressionManager(applicationContext, processEngineConfiguration.getBeans()));}}...
}

使用表达式

Activiti的Expression 接口

public interface Expression extends Serializable {// variableScope 为变量作用域Object getValue(VariableScope variableScope);void setValue(Object value, VariableScope variableScope);String getExpressionText();}

在代码中的具体使用

//获取表达式对象
//execution 为 VariableScope 的实现类 用于从不同的变量作用域中取变量
Expression expression = expressionManager.createExpression("${bean.id}");businessKey = expression.getValue(execution).toString();

为什么有VariableScope

因为Activiti中有很多流程,每一个流程都有很多变量,使用变量的时候肯定不能去拿其他流程的变量,为了更好的管理在表达式中使用变量,所以这里就有了一个变量作用域的概念

通过变量作用域获得EL上下文

public class ExpressionManager {
...public ELContext getElContext(VariableScope variableScope) {ELContext elContext = null;if (variableScope instanceof VariableScopeImpl) {VariableScopeImpl variableScopeImpl = (VariableScopeImpl) variableScope;elContext = variableScopeImpl.getCachedElContext();}if (elContext == null) {//如果没有就创建一个EL上下文elContext = createElContext(variableScope);if (variableScope instanceof VariableScopeImpl) {((VariableScopeImpl) variableScope).setCachedElContext(elContext);}}return elContext;}
...
}

VariableScope 的实现类

实现类就只要有三个类

  • NoExecutionVariableScope.java
  • TaskEntityImpl.java
  • ExecutionEntityImpl.java

其中VariableScopeImpl 是个抽象类,这里使用了模板模式

需要子类实现的方法

protected abstract Collection<VariableInstanceEntity> loadVariableInstances();protected abstract VariableScopeImpl getParentVariableScope();protected abstract void initializeVariableInstanceBackPointer(VariableInstanceEntity variableInstance);protected abstract VariableInstanceEntity getSpecificVariable(String variableName);

JUEL实现类

public class JuelExpression implements Expression {protected String expressionText;protected ValueExpression valueExpression;public JuelExpression(ValueExpression valueExpression, String expressionText) {this.valueExpression = valueExpression;this.expressionText = expressionText;}public Object getValue(VariableScope variableScope) {//获取值的时候都要通过variableScope获取上下文ELContext elContext = Context.getProcessEngineConfiguration().getExpressionManager().getElContext(variableScope);try {ExpressionGetInvocation invocation = new ExpressionGetInvocation(valueExpression, elContext);Context.getProcessEngineConfiguration().getDelegateInterceptor().handleInvocation(invocation);return invocation.getInvocationResult();} catch (PropertyNotFoundException pnfe) {throw new ActivitiException("Unknown property used in expression: " + expressionText, pnfe);} catch (MethodNotFoundException mnfe) {throw new ActivitiException("Unknown method used in expression: " + expressionText, mnfe);} catch (ELException ele) {throw new ActivitiException("Error while evaluating expression: " + expressionText, ele);} catch (Exception e) {throw new ActivitiException("Error while evaluating expression: " + expressionText, e);}}public void setValue(Object value, VariableScope variableScope) {ELContext elContext = Context.getProcessEngineConfiguration().getExpressionManager().getElContext(variableScope);try {ExpressionSetInvocation invocation = new ExpressionSetInvocation(valueExpression, elContext, value);Context.getProcessEngineConfiguration().getDelegateInterceptor().handleInvocation(invocation);} catch (Exception e) {throw new ActivitiException("Error while evaluating expression: " + expressionText, e);}}@Overridepublic String toString() {if (valueExpression != null) {return valueExpression.getExpressionString();}return super.toString();}public String getExpressionText() {return expressionText;}
}

Activiti UEL表达式是如何与Spring 的容器整合起来的相关推荐

  1. uel表达式 字符串截取_(4)activiti工作流引擎之uel表达式

    有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购单,如何跟一个流程实例互相关联起来? 这里就需要使用到activiti启动流程实例时设置一个流程实例的busines ...

  2. activiti个人任务分配,UEL表达式,监听器分配,任务查询

    文章目录 一.个人任务 1..分配任务负责人 1.1.固定分配 1.2.表达式分配 1.2.1.UEL 表达式 1)UEL-value 定义 2)UEL-method 方式 3)UEL-method ...

  3. 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<UEL表达式篇>

    文章目录 前言 一.表达式分配负责人 1.UEL 表达式 1.部署流程 2.启动流程 3.我的待办 4.执行任务 2.UEL-method 方式 1.创建SpringBean 2.部署流程 3.启动流 ...

  4. [Activiti] UEL 统一表达式语言 (任务节点 Assignee 通过变量获取)

    UEL是java EE6规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method. ...

  5. [Activiti]UEL(Unified Expression Language)即统一表达式语言

    UEL是java EE6规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method. ...

  6. Activiti(十三)UEL 表达式分配个人任务

    当我们画bpmn的时候不指定哪个任务由哪个参与者执行的时候可以使用UEL 表达式分配个人任务 UEL 表达式分配个人任务 步骤: 画bpmn图 代码指定 第一步:画bpmn图 第二步:代码实现 步骤: ...

  7. Activity的UEL 表达式

    Activiti 使用 UEL 表达式,UEL 是 java EE6 规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti 支持两个 UEL ...

  8. uel表达式 字符串截取_activiti工作流引擎之uel表达式

    qq讨论群:313032825 本人做了一个微信公众号,用于分享各类视频学习资源和我多年学习经验,喜欢的可以关注哦! 有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采 ...

  9. 工作流中的UEL表达式的使用

    公共spring配置文件: Xml代码   <?xml version="1.0" encoding="UTF-8"?> <beans xml ...

最新文章

  1. Linux EOF使用
  2. python基础-字符串
  3. 汽车开放系统架构(AUTOSAR)简介
  4. python新建文件夹口令_Python 口令保管箱
  5. 大数据的数据采集数据处理_让我们处理大数据
  6. wex5中win8或者win10操作系统studio中新建.w向导或其他的编辑窗口显示不全
  7. 经典编程问题之:选择排序、冒泡排序、汉诺塔游戏,均用js代码实现
  8. sql 可以多个分组吗_你知道吗?罗非鱼的品种多达100多个,不单是食用鱼也可以是观赏鱼...
  9. 人工智能 VS 机器学习 VS 深度学习
  10. SVM实现多分类的三种方案
  11. 2021年最棒的10款Java框架,你喜欢哪个?
  12. 基于vlmcsd搭建KMS服务器
  13. 小学生可以学java编程吗_小学生学编程都要学习哪些内容 家长们知道吗
  14. 经典运放电路详细分析(模拟电子技术)
  15. Xilinx 7A 开发流程——工程模式 ARTY XC7A35T
  16. 前端React下载文件到浏览器
  17. cocos creator 打包ios 构建失败
  18. java解析bt协议详解_【转】bt协议的详细分析
  19. C 语言for的语法规则和for(;;)的解析
  20. python日常工作_python日常工作 - osc_sd6j22mg的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. 三年级计算机考试题目及答案,三年级信息技术试题及答案.doc
  2. C_C++圣战(摘录)
  3. Office EXCEL 表格如何设置某个单元格是选择项,如何设置二级下拉菜单 WPS版
  4. Idea 使用svn创建新分支
  5. 铁乐学python-shelve模块详解
  6. 微软Windows10LTSC2019官方三月更新版镜像
  7. H264 NALU详解
  8. java计算机毕业设计vue的高校个性化选课推荐源码+数据库+系统+lw文档+mybatis+运行部署
  9. Zuul 2 : The Netflix Journey to Asynchronous, Non-Blocking Systems
  10. 心情低落的时候看一看