🌰构造EL
# 依赖
从2.11.1版本开始,你可以在代码中动态组装EL表达式,包括创建、修改、输出EL表达式。
如果需要在代码中动态构建EL表达式,需要添加以下额外依赖:
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-el-builder</artifactId>
<version>2.11.4.2</version>
</dependency>
# 构建一个EL表达式
你可以通过工厂类ELBus创建任何一个EL表达式。比如对于这样一个EL表达式:
图示
可以调用如下方法组装该表达式:
// 组装EL表达式
ThenELWrapper el = ELBus.then("a",
ELBus.when("b").when(ELBus.then("c", "d")),
"e");
可以调用toEL()
方法输出EL表达式:
THEN(node("a"),WHEN(node("b"),THEN(node("c"),node("d"))),node("e"))
提示
为了避免可能的冲突,node("")将组件名进行了包装,以确保Node的名称与LiteFlow组件名规范不发生冲突。更详细的内容请查看组件名包装。
除了构建表达式之外,你也可以在表达式中调用表达式的关键字,比如为选择组件的子组件设置id、tag,设置并行组件的any关键字等等。如下例所示:
<!-- 目标EL表达式 -->
<chain name="chain1">
whenData = '{"name":"zhangsan","age":18}';
WHEN(
node("a"),
WHEN(
node("b").data(whenData),
node("c")
).id("this is a id"),
node("d")
).any(true).tag("this is a tag")
</chain>
可以通过以下方法组装出该EL表达式,调用对应的关键字,并输出对应的表达式。
// EL表达式组装
WhenELWrapper el = ELBus.when("a",
ELBus.when(ELBus.node("b").data("whenData", "{\"name\":\"zhangsan\",\"age\":18}"))
.when("c")
.id("this is a id"),
"d").tag("this is a tag").any(true);
该EL表达式输出如下:
whenData = '{"name":"zhangsan","age":18}';
WHEN(node("a"),WHEN(node("b").data(whenData),node("c")).id("this is a id"),node("d")).any(true).tag("this is a tag")
# 格式化输出EL表达式
容易能发现toEL()
方法输出的EL表达式是一行字符串,不方便查看以及校验EL表达式是否正确。可以使用 toEL(true)
方法以树形结构输出EL表达式。对于上一个例子中的EL表达式,调用el.toEL(true)
方法,得到树型结构表达式输出如下:
whenData = '{"name":"zhangsan","age":18}';
WHEN(
node("a"),
WHEN(
node("b").data(whenData),
node("c")
).id("this is a id"),
node("d")
).any(true).tag("this is a tag")
# 目前支持的表达式和关键字
目前支持到2.11.1版本的所有EL表达式,包括其中的关键字和高级特性。当前支持的详细内容如下表:
EL表达式 | 创建方法 | 支持调用方法 | 支持关键字 |
---|---|---|---|
串行编排 | ELBus.then | then(Object ... objects) | pre finally tag id maxWaitSeconds |
并行编排 | ELBus.when | when(Object ... objects) | any ignoreError customThreadExecutor must tag id maxWaitSeconds |
选择编排 | ELBus.switch | to(Object... objects) defaultOpt(Object object) | tag id maxWaitSeconds |
条件编排 | ELBus.ifOpt | elseOpt(Object falseObject) elIfOpt(Object ifObject, Object trueObject) | tag id maxWaitSeconds |
循环编排 | ELBus.forOpt ELBus.whileOpt ELBus.iteratorOpt | doOpt(Object object) breakOpt(Object object) (ITERATOR迭代器循环表达式不支持) | parallel tag id maxWaitSeconds |
捕获异常表达式 | ELBus.catchException | doOpt(Object object) | tag id maxWaitSeconds |
与表达式 | ELBus.and | and(Object ... object) | tag id maxWaitSeconds |
或表达式 | ELBus.or | or(Object ... object) | tag id maxWaitSeconds |
非表达式 | ELBus.not | tag id maxWaitSeconds | |
单节点表达式 | ELBus.node | tag data maxWaitSeconds | |
前置组件 | 通过then组件的pre关键字创建 | tag id maxWaitSeconds | |
后置组件 | 通过then组件的finally关键字创建 | tag id |
# EL表达式参数校验
组装表达式时会对表达式的参数类型进行校验。包括是否为单节点组件、是否允许为与或非表达式等。比如,WHILE表达式WHILE(w).DO(THEN(a, b));
中,w需要是返回布尔值的节点或与或非表达式。
更多测试样例请在 liteflow-testcase-el/liteflow-testcase-el-builder
模块中查看。
帮助我们改善此文档 (opens new window)
上次更新: 2024/04/09, 18:39:17