activiti是支持juel表达式的,这个也很好用,但实际过程中需要支持类方法及变量。

原来项目中解析juel,这边有自定义一个方法的

代码如下:

public String getStringByELAndFormData(String el, Map formData) throws Exception {

ExpressionFactory factory = new ExpressionFactoryImpl();

SimpleContext context = new SimpleContext();

for (Object k : formData.keySet()) {

if (formData.get(k) != null) {

context.setVariable(k.toString(),

factory.createValueExpression(formData.get(k), formData.get(k).getClass()));

}

}

ValueExpression e = factory.createValueExpression(context, el, String.class);

return (String) e.getValue(context);

}

这种办法没有问题,但只局限于变量执行。但如果增加方法类调用就有问题!

如现在我有一个juely变量表达式,表达式为${fn_test.getJiebaoPost('','','')}。

该表达式需要调用以下类

public class FunctionOrgService {

public String getJiebaoPost(String id,String nodeFlag,String exParams){

return "82301111111";

}

}

原来解析的代码就有问题了,因为他没办法识别该函数.

解决办法如下

先在processEngine初始化时,增加函数的引入

Map map=new HashMap();

map.put("fn_test", new FunctionOrgService());

processEngineConfiguration.setBeans(map);

构造变量类VariableScope

特别说明一下,这个如果流程未结束,可以直接用流程实例对象ExecutionEntity代替,因为该类也继承了VariableScope。  这边项目需要流程结束也要计算juel表达式,所以只能自己构造该对象

import java.util.Collection;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import org.activiti.engine.delegate.VariableScope;

import org.activiti.engine.impl.persistence.entity.VariableInstance;

public class TestVariableScope implements VariableScope{

private Map variables=new HashMap();

public TestVariableScope(Map variables){

this.variables=variables;

}

@Override

public Map getVariables() {

// TODO Auto-generated method stub

return variables;

}

@Override

public Map getVariableInstances() {

/*// TODO Auto-generated method stub

Map variableInstanceMap=new HashMap();

System.out.println("通过Map.entrySet遍历key和value");

for (Map.Entry entry : variables.entrySet()) {

VariableInstanceEntity variableInstance=VariableInstanceEntity.create( entry.getKey(), type, entry.getValue())

}*/

return null;

}

@Override

public Map getVariables(Collection variableNames) {

// TODO Auto-generated method stub

return variables;

}

@Override

public Map getVariableInstances(Collection variableNames) {

// TODO Auto-generated method stub

return null;

}

@Override

public Map getVariables(Collection variableNames, boolean fetchAllVariables) {

// TODO Auto-generated method stub

return variables;

}

@Override

public Map getVariableInstances(Collection variableNames,

boolean fetchAllVariables) {

// TODO Auto-generated method stub

return null;

}

@Override

public Map getVariablesLocal() {

// TODO Auto-generated method stub

return variables;

}

@Override

public Map getVariableInstancesLocal() {

// TODO Auto-generated method stub

return null;

}

@Override

public Map getVariablesLocal(Collection variableNames) {

// TODO Auto-generated method stub

return variables;

}

@Override

public Map getVariableInstancesLocal(Collection variableNames) {

// TODO Auto-generated method stub

return null;

}

@Override

public Map getVariablesLocal(Collection variableNames, boolean fetchAllVariables) {

// TODO Auto-generated method stub

return variables;

}

@Override

public Map getVariableInstancesLocal(Collection variableNames,

boolean fetchAllVariables) {

// TODO Auto-generated method stub

return null;

}

@Override

public Object getVariable(String variableName) {

// TODO Auto-generated method stub

return variables.get(variableName);

}

@Override

public VariableInstance getVariableInstance(String variableName) {

// TODO Auto-generated method stub

return null;

}

@Override

public Object getVariable(String variableName, boolean fetchAllVariables) {

// TODO Auto-generated method stub

return this.getVariable(variableName);

}

@Override

public VariableInstance getVariableInstance(String variableName, boolean fetchAllVariables) {

// TODO Auto-generated method stub

return null;

}

@Override

public Object getVariableLocal(String variableName) {

// TODO Auto-generated method stub

return this.getVariable(variableName);

}

@Override

public VariableInstance getVariableInstanceLocal(String variableName) {

// TODO Auto-generated method stub

return null;

}

@Override

public Object getVariableLocal(String variableName, boolean fetchAllVariables) {

// TODO Auto-generated method stub

return this.getVariable(variableName);

}

@Override

public VariableInstance getVariableInstanceLocal(String variableName, boolean fetchAllVariables) {

// TODO Auto-generated method stub

return null;

}

@Override

public T getVariable(String variableName, Class variableClass) {

// TODO Auto-generated method stub

return null;

}

@Override

public T getVariableLocal(String variableName, Class variableClass) {

// TODO Auto-generated method stub

return null;

}

@Override

public Set getVariableNames() {

// TODO Auto-generated method stub

return null;

}

@Override

public Set getVariableNamesLocal() {

// TODO Auto-generated method stub

return null;

}

@Override

public void setVariable(String variableName, Object value) {

// TODO Auto-generated method stub

variables.put(variableName,value);

}

@Override

public void setVariable(String variableName, Object value, boolean fetchAllVariables) {

// TODO Auto-generated method stub

this.setVariable(variableName, value);

}

@Override

public Object setVariableLocal(String variableName, Object value) {

// TODO Auto-generated method stub

return null;

}

@Override

public Object setVariableLocal(String variableName, Object value, boolean fetchAllVariables) {

// TODO Auto-generated method stub

return null;

}

@Override

public void setVariables(Map variables) {

// TODO Auto-generated method stub

this.variables=(Map) variables;

}

@Override

public void setVariablesLocal(Map variables) {

// TODO Auto-generated method stub

this.variables=(Map) variables;

}

@Override

public boolean hasVariables() {

// TODO Auto-generated method stub

return variables.size()>0;

}

@Override

public boolean hasVariablesLocal() {

// TODO Auto-generated method stub

return variables.size()>0;

}

@Override

public boolean hasVariable(String variableName) {

// TODO Auto-generated method stub

return variables.containsKey(variableName);

}

@Override

public boolean hasVariableLocal(String variableName) {

// TODO Auto-generated method stub

return variables.containsKey(variableName);

}

@Override

public void createVariableLocal(String variableName, Object value) {

// TODO Auto-generated method stub

}

@Override

public void removeVariable(String variableName) {

// TODO Auto-generated method stub

}

@Override

public void removeVariableLocal(String variableName) {

// TODO Auto-generated method stub

}

@Override

public void removeVariables(Collection variableNames) {

// TODO Auto-generated method stub

}

@Override

public void removeVariablesLocal(Collection variableNames) {

// TODO Auto-generated method stub

}

@Override

public void removeVariables() {

// TODO Auto-generated method stub

}

@Override

public void removeVariablesLocal() {

// TODO Auto-generated method stub

}

}

以上代码只传入一个map即可,很多方法不需要实现.

3.执行juel的表达式

public class JuelExpressonCommand implements Command {

private static Logger logger = LoggerFactory.getLogger(JuelExpressonCommand.class);

/**

* 取消沟通

*/

private String el;

/**

* 流程变量

*/

private Map formData;

public JuelExpressonCommand(String el, Map formData) {

super();

this.el = el;

this.formData = formData;

}

@Override

public Object execute(CommandContext commandContext) {

ProcessEngineConfigurationImpl processEngineConfiguation=commandContext.getProcessEngineConfiguration();

ExpressionManager expressionManager=processEngineConfiguation.getExpressionManager();

Expression e = expressionManager.createExpression(el);

CdpVariableScope variableScope=new CdpVariableScope(formData);

return e.getValue(variableScope);

}

}

至此,该表达式解析OK!

java juel表达式_activiti 自定义函数解析juel表达式相关推荐

  1. java 8之函数编程自定义函数接口@FunctionalInterface

    什么是函数式接口(Functional Interface) 所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法. 补充下:方法也可以有具体默认实现逻辑,需要用defaul ...

  2. Java魔法堂:自定义和解析注解

    一.前言 注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然 ...

  3. 流水号结合自定义函数实现申请业务

    需求: 客户有个需求是想利用行式填报表的流水号来进行一个申请业务的处理(主键自动生成).但是在行式填报表中对流水号的触发只能在行式报表的插入功能的进行触发,这对于刚进入报表展现页面自动展现第一条记录就 ...

  4. windows下mysql 自定义函数 之http 实操

    有没有遇到这种场景呢,当使用mysql做复杂字符串处理的时候总感觉mysql内置的函数不够用呢.比如做字符串切割,解析xml等.而这个时候你恰恰对编写mysql函数或者存储过程缺乏一定的经验积累.而你 ...

  5. EL表达式中fn函数(转载)

    EL表达式中fn函数 JSTL 使用表达式来简化页面的代码,这对一些标准的方法,例如bean的getter/setter方法,请求参数或者context以及 session中的数据的访问非常方便,但是 ...

  6. spark自定义函数

    1.使用java,scala或者python等都可以编写自定义函数,编写完成后通过spark.udf函数注册即可使用 2.spark也支持hive自定义函数,使用类似create temporary ...

  7. java根据Stack栈实现公式解析和自定义函数(一)

    我是看到了大佬的博客还能这样解析,我们来解析一下思路并扩展一下,传送门:java实现公式解析 1. Stack的介绍 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数 ...

  8. java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用

    我无法解决看似微不足道的问题.我的问题可能是缺乏对Kotlin语言的经验(和理解).不过,我将需要帮助. 我做了一个自定义类,其中包含一个自定义函数.看起来很简单,但是当我尝试使用此功能时,我一直收到 ...

  9. Java自定义Cron,解析Cron表达式

    Cron表达式中周和数字是不对应的 周一:2:周二:3:周三:4:周四:5:周五:6:周六:7:周日:1 pom文件必须依赖 <dependency><groupId>com. ...

最新文章

  1. 2020人工神经网络第一次作业
  2. 【368天】跃迁之路——程序员高效学习方法论探索系列(实验阶段126-2018.02.08)...
  3. 计算机e盘拒绝访问,电脑中的D盘与E盘拒绝访问是为什么?
  4. 【NC14 按之字形顺序打印二叉树】
  5. linux启动php服务_群晖docker 实现nodejs为后端的简单web服务器 并连接数据库
  6. js获取 jquery获取页面shu
  7. 蚂蚁的开放:想办法摸到10米的篮筐
  8. centos 6.5 yum
  9. MySQL 8.0设置sort_buffer_size
  10. 计算机管理如何格式化u盘,u盘无法格式化?0字节?教你5种方法格式化u盘,超简单!...
  11. 编码器/译码器(Verilog HDL)|计算机组成
  12. android drm框架分析,如何使用android.drm框架
  13. 【Python百日进阶-Web开发-Feffery】Day432 - fac实例:使用国内cdn加载静态资源
  14. 将一个字符串转换为对应的整数
  15. Mysql 数据库实战-建库-建表-查多表
  16. 微信小程序轮播图swiper详细代码介绍
  17. D3.js实现带动画效果的柱状图
  18. Connections could not be acquired from the underlying database!
  19. StarGAN-多领域图像翻译
  20. Barsetto百胜图BAV01办公首选咖啡机

热门文章

  1. Understanding ScriptResource and WebResource in ASP.NET
  2. 极客大赛助力BCH应用开发
  3. 文件,文件的打开,拷贝,写入
  4. 为什么 Django 能持续统治 Python 开发世界
  5. cxf使用wsdl文件生成代码
  6. 九款让WordPress成为赚钱利器的广告插件
  7. Python IDLE或shell中切换路径
  8. 临时表temporary table
  9. CeSharp支持MP4
  10. SQL语句小tips(持续更新)