Dataweave 1.0脚本迁移至2.0触发无效输入语法错误的解决咨询
DataWeave 1.0转2.0语法报错原因与等价实现
报错根因
- 切片语法不兼容:DataWeave 1.0 支持用
[起始索引..结束索引]做字符串/数组的范围截取,该写法在2.0版本中被移除。解析器遇到方括号内的..连接符会直接中断解析流程,将后续识别为非法属性名读取,触发“期望输入类型为PropertyName”的语法错误,报错位置可能偏移到filter或map语句行,和你遇到的报错表现完全匹配。 - 高阶函数解析规则变化:2.0版本对高阶函数(filter/map)的嵌套表达式解析比1.0严格,多层括号嵌套未显式声明迭代参数时,容易出现语法边界识别错误,进一步放大报错位置的偏差。
完全等价的2.0实现代码
%dw 2.0 output application/java // 1:1复刻原1.0版本checkNull的判断逻辑 fun checkNull(value) = if (value == null) '' else value --- payload.MMAP_SUPPLIER_DETAILS_OBJ_TYPE.SITES.*MMAP_SUPPLIER_SITE_OBJ_TYPE filter (site -> // 替换1.0的[0..3]为2.0兼容的[0 to 3]范围截取,保持闭区间取值逻辑完全不变 (site.VENDOR_SITE_CODE[0 to 3] == 'CHN ' or site.VENDOR_SITE_CODE[0 to 3] == 'FDL ' or site.VENDOR_SITE_CODE[0 to 3] == 'HPP ' or site.VENDOR_SITE_CODE[0 to 3] == 'MEX ' or site.VENDOR_SITE_CODE[0 to 3] == 'P&A ' or site.VENDOR_SITE_CODE[0 to 3] == 'STC ') and (site.ORG_ID == '116' or site.ORG_ID == '5195') and checkNull(site.INACTIVE_DATE) == '' ) map (validSite) -> { // 替换原[0..2]切片为2.0兼容写法,截取前3位字符的逻辑不变 Entity: validSite.VENDOR_SITE_CODE[0 to 2] }
功能等价性校验说明
- 截取逻辑无偏差:
[0 to n]的取值范围为包含索引0到n的闭区间,和1.0版本[0..n]的截取结果完全一致,不会出现字符偏移 - 过滤规则无改动:站点编码前缀判断、组织ID范围判断、无效日期非空判断的条件与原脚本完全对齐
- 输出结构无差异:最终生成的Java格式对象仅包含
Entity字段,取值规则与原脚本完全一致
可选代码优化(功能与原逻辑完全等价):
为减少重复判断语句,可以将多段or连接的站点编码校验替换为集合匹配:// 替换原filter内的多段站点编码or判断 (['CHN ', 'FDL ', 'HPP ', 'MEX ', 'P&A ', 'STC '] contains site.VENDOR_SITE_CODE[0 to 3])
内容的提问来源于stack exchange,提问作者ddog0823
相关产品推荐
相关产品推荐

