activiti分支判断
有接触过activiti的小伙伴们,可能会知道activiti可以利用网关来达到分支流转,但是对于一些业务员来说,跟他们说啥是网关,他们可能会一脸懵逼,尤其activiti的网关有那多个,比如互斥网关、并行网关、兼容网关等等,这个给非研发的小伙伴在画流程时,带来的一定难度。在网上查找了一些例子,发现他们实现分支判断,大部分都依靠网关来实现。然而我发现其实在节点的连接线上,设置一些分支条件流转规则也可以达到效果。如下图
其BPMN文件分支内容为
<sequenceFlow id="flow2" name="<=3" sourceRef="usertask1" targetRef="usertask2"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days<=3}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow3" name=">3" sourceRef="usertask1" targetRef="usertask3"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days>3}]]></conditionExpression> </sequenceFlow>
而如果有网关时候的流程图如下图
经过代码测试发现,去除了网关,只用juel表达式也可以实现条件流转
什么是juel
其官网的定义是:JUEL is an implementation of the Unified Expression Language (EL), specified as part of the JSP 2.1 standard (JSR-245), which has been introduced in JEE5. Additionally, JUEL 2.2 implements the JSP 2.2 maintenance release specification for full JEE6 compliance. 其中文大意是:JUEL是统一表达式语言(EL)的一种实现,它被指定为JSP 2.1标准(JSR-245)的一部分,该标准已在JEE5中引入。 此外,JUEL 2.2实现了JSP 2.2维护版本规范,以实现完整的JEE6合规性。 其写法和el表达式一模一样,如${day>3}
如何利用juel表达式实现分支判断
代码实现逻辑
public static Boolean checkFormDataByRuleEl(String el, Map<String, Object> 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, Boolean.class); return (Boolean) e.getValue(context); } public static void main(String[] args) throws Exception { String el = "${请假天数>3 && 部门 == '产品部'}"; Map<String, Object> formData = new HashMap<>(); formData.put("请假天数", 4); formData.put("部门", "产品部"); formData.put("test", "123"); System.out.println(checkFormDataByRuleEl(el, formData)); }
控制台输出
true
根据juel表达式的true或者false可以很容易在代码实现分支判断
在非activiti项目中如何使用juel表达式判断
引入依赖包
<dependency> <groupId>juel</groupId> <artifactId>juel</artifactId> <version>2.1.0</version></dependency>
代码逻辑实现
public static Boolean checkFormDataByRuleEl(String el, Map<String, Object> 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, Boolean.class); return (Boolean) e.getValue(context); }
本文由 admin 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:2022-08-09 22:40:40