DataWeave 2中能否将字符串形式的代码解析执行?
问题描述
假设file.properties文件中有如下配置项:
aaa.code=now() - |P2D|
使用以下DataWeave 2代码读取该配置时,返回的是字符串形式的原始内容,而非执行now() - |P2D|后的计算结果:
%dw 2.0 output application/json --- { "from": p('aaa.code') }
需要实现解析执行该配置中的DataWeave表达式,但不能使用eval、execute这类实验性方法。
解决方案
由于官方动态执行的实验性方法不符合要求,只能通过手动解析配置字符串的方式实现逻辑,核心思路是拆解表达式中的函数和参数,再用DataWeave原生能力完成计算。
针对当前场景的实现
针对now() - |P2D|这类特定格式的表达式,可编写自定义函数来解析:
%dw 2.0 output application/json import * from dw::core::Dates fun parseExpr(expr: String) = do { // 拆分表达式为操作符两侧的内容 var parts = splitBy(expr, " - ") // 提取时间间隔字符串(去除前后的|符号) var durationStr = replace(parts[1], /^\|(.*)\|$/, "$1") --- now() - duration(durationStr) } --- { "from": parseExpr(p('aaa.code')) }
扩展适配更多场景
如果配置中的表达式格式更复杂(比如支持不同时间函数、加法操作等),可以扩展解析逻辑:
- 用正则表达式精准匹配函数名、参数和操作符
- 封装不同函数的处理分支(比如兼容
utcNow()) - 增加对加法、乘法等其他时间操作的支持
这种方法完全基于DataWeave的稳定特性,虽然灵活性不如动态执行,但避免了使用实验性API的风险。
内容的提问来源于stack exchange,提问作者YannickN.fr
相关产品推荐
相关产品推荐

