【问题标题】:ignore invalid or null date field in dwl 1.0 mule 3忽略 dwl 1.0 mule 3 中的无效或空日期字段
【发布时间】:2021-08-26 12:50:14
【问题描述】:

我正在尝试验证输入有效负载中的日期和日期时间。如果日期或日期时间格式不正确或为空,我必须验证请求并删除该字段。如果格式正确或为空值,它会按预期工作,但如果格式错误,则会抛出错误 "Cannot coerce a :string to a :localdatetime"

如何在 dwl 1.0 (mule3) 中解决此问题

    Input:
    {
      "date1": "2021-02-12 00:00:00",
      "date2": "2021-02-12",
      "date3": "2021-02-121",
      "date4": "2021-024-123 00:00:00",
      "date5": "",
      "date6": null
    }

    Expected Output:
    {
      "date1": "2021-02-12 00:00:00",
      "date2": "2021-02-12",
    }

    code: 
    %dw 1.0

    %output application/java
    %function transformDate(dt) (dt as :date {format: "dd/MM/yyyy"} as :string {format: "yyyy-MM-dd"})
    %function changeDateTime(cdt) (cdt as :localdatetime {format: "dd/MM/yyyy HH:mm:ss"} as :string {format: "yyyy-MM-dd'T'HH:mm:ss"})
    %function isEmpty(value) (value!=null and value!="")


    ---
    {
        (date1: changeDateTime(payload.date1) as :date) when (isEmpty(payload.date1)),
        (date2: transformDate(payload.date2) as :localdatetime) when isEmpty(payload.date2),
        (date3: transformDate(payload.date3) as :localdatetime) when isEmpty(payload.date3),
        (date4: changeDateTime(payload.date4) as :localdatetime) when isEmpty(payload.date4),
        (date5: transformDate(payload.date5) as :localdatetime) when isEmpty(payload.date5),    
        (date6: transformDate(payload.date6) as :localdatetime) when isEmpty(payload.date6)         
    }

【问题讨论】:

  • 您的示例中哪种情况失败了?请提供输入和完整输出中的属性名称。
  • @aled 我已经添加了完整的输入和预期的输出。 date3 和 date4 格式不正确,这就是它失败的原因
  • 完整的错误消息显示错误是什么,哪个输入与哪个表达式不匹配。那会很有帮助。
  • @aled 错误消息我已经提到过。 "不能将 :string 强制转换为 :localdatetime"
  • 但不是“完整”错误消息。我在答案中添加了它,因为它添加到上下文中。

标签: mule mule-studio dataweave mulesoft


【解决方案1】:

问题在于,当尝试使用不匹配的模式解析输入日期时,DataWeave 会引发错误:

Message               : Exception while executing: 
%function changeDateTime(cdt) (cdt as :localdatetime {format: "dd/MM/yyyy HH:mm:ss"} as :string {format: "yyyy-MM-dd'T'HH:mm:ss"})
                               ^
Cannot coerce a :string to a :localdatetime, caused by :Text '2021-02-12 00:00:00' could not be parsed at index 2.

在 DataWeave 2/Mule 4 中,您有 try() 函数来测试某些表达式是否失败。不幸的是,DataWeave 1/Mule 3 中没有等效的方法。作为替代方案,您可以使用以下方法之一:

  • 将每个可能失败的表达式隔离到单独的脚本中,并将其封装到可以捕获该表达式的错误处理程序中。
  • 使用KB article 中描述的方法来保护每个带有条件的模式转换,并在尝试之前尝试测试模式是否匹配。示例(dateStr) -> dateStr as :localdatetime {format: "E, d LLL u H:m:s O"} when (dateStr contains /^[A-z][A-z][A-z],/) otherwise (dateStr as :localdatetime {format: "E LLL d H:m:s u"} when (dateStr contains /^[A-z][A-z][A-z]\s/) otherwise dateStr as :localdatetime {format: "cccc, d-LLL-u H:m:s O"})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2022-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多