【问题标题】:Dataweave 1.0 to 2.0Dataweave 1.0 到 2.0
【发布时间】:2021-05-03 14:38:15
【问题描述】:

尝试将以下 dataweave 从 1.0 转换为 2.0,但我尝试过的所有操作都会出现以下错误之一。关于如何在 dataweave 2.0 中编写相同的任何想法?

输入无效“map {Entity: $.VENDOR_SITE_CODE[0..2”,预期的 PropertyName 或? 无效的输入“过滤器(($.VENDOR_SITE_CODE[0..3”,预期的 PropertyName 或?

%dw 1.0
%output application/java
%function checkNull(value) '' when value == null otherwise value
---
payload.MMAP_SUPPLIER_DETAILS_OBJ_TYPE.SITES.*MMAP_SUPPLIER_SITE_OBJ_TYPE 
    filter (($.VENDOR_SITE_CODE[0..3] == 'CHN '
             or $.VENDOR_SITE_CODE[0..3] == 'FDL '
             or $.VENDOR_SITE_CODE[0..3] == 'HPP '
             or $.VENDOR_SITE_CODE[0..3] == 'MEX '
             or $.VENDOR_SITE_CODE[0..3] == 'P&A '
             or $.VENDOR_SITE_CODE[0..3] == 'STC ')
             and ($.ORG_ID == '116' or $.ORG_ID == '5195')
            and checkNull($.INACTIVE_DATE) == '')
    map {
        Entity: $.VENDOR_SITE_CODE[0..2]
    }


%dw 2.0
output application/java
fun checkNull(value) = if (value == null) '' else value
---
payload.MMAP_SUPPLIER_DETAILS_OBJ_TYPE.SITES.*MMAP_SUPPLIER_SITE_OBJ_TYPE
    filter (($.VENDOR_SITE_CODE[0..3] == 'CHN '
             or $.VENDOR_SITE_CODE[0..3] == 'FDL '
             or $.VENDOR_SITE_CODE[0..3] == 'HPP '
             or $.VENDOR_SITE_CODE[0..3] == 'MEX '
             or $.VENDOR_SITE_CODE[0..3] == 'P&A '
             or $.VENDOR_SITE_CODE[0..3] == 'STC ')
            and ($.ORG_ID == '116' or $.ORG_ID == '5195')
            and checkNull($.INACTIVE_DATE) == '')
    map {
        Entity: $.VENDOR_SITE_CODE[0..2]
    }

【问题讨论】:

  • 导致该错误的 DataWeave 2 的输入和脚本是什么?
  • 另外,您还应该提供您尝试过的 DW 2.0 表达式。
  • 如果你碰巧有本地版本的 DW。 2.0 Playground 在您的机器上运行,您只需复制并粘贴 DW 1.0 脚本,它就会为您生成等效的 DW 2.0 脚本。这同样适用于 DW 的 IntelliJ 插件。但是,dwlang.fun 中还没有该功能。

标签: dataweave


【解决方案1】:

有些事情发生了变化。首先,输出没有以% 开头,并且if 语句现在的格式为if (condition) result else otherResult。现在还使用START to FINISH 指定范围,例如:0 to -1 选择整个范围。

试试这个:

%dw 2.0
output application/java
fun checkNull(value) = if (value == null) '' else value
---
payload.MMAP_SUPPLIER_DETAILS_OBJ_TYPE.SITES.*MMAP_SUPPLIER_SITE_OBJ_TYPE 
    filter (($.VENDOR_SITE_CODE[0 to 3] == 'CHN '
             or $.VENDOR_SITE_CODE[0 to 3] == 'FDL '
             or $.VENDOR_SITE_CODE[0 to 3] == 'HPP '
             or $.VENDOR_SITE_CODE[0 to 3] == 'MEX '
             or $.VENDOR_SITE_CODE[0 to 3] == 'P&A '
             or $.VENDOR_SITE_CODE[0 to 3] == 'STC ')
             and ($.ORG_ID == '116' or $.ORG_ID == '5195')
            and checkNull($.INACTIVE_DATE) == '')
    map {
        Entity: $.VENDOR_SITE_CODE[0 to 2]
    }

就像@aled 提到的那样,尽管查看输入和预期输出会有所帮助。

【讨论】:

  • 谢谢迈克尔。我将您发送的内容复制/粘贴到我的 Mulesoft 应用程序的转换消息中,没有错误,成功部署,运行了几个测试,它按我的预期工作。我所做的是将我的 Mule 3 应用程序中的 dataweave 1.0 代码复制/粘贴到记事本中,对其进行编辑,然后将其复制/粘贴到我的 Mule 4 转换中(我使用的如下所示),这导致了“过滤器”错误我上面的原始帖子,但看起来与您的相似。也许是换行符或从复制/粘贴到记事本中的东西,我看不到。不会再使用记事本了。
  • 更正,我在上面的原始帖子中添加了我正在使用的内容。一定是一些换行符、制表符等……我看不到的东西,这是导致错误的原因。再次感谢迈克尔!
  • 注意,您可以使用value default '''替换if (value==null) ...,并完全删除客户功能。更多信息见docs.mulesoft.com/mule-runtime/4.3/…
  • 实际上,您最好只使用isEmpty 来解决这个问题,而不是在(value default '') == '' 处进行过滤
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多