首页 > 解决方案 > 忽略 dwl 1.0 mule 3 中的无效或空日期字段

问题描述

我正在尝试验证输入有效负载中的日期和日期时间。如果日期或日期时间格式不正确或为空,我必须验证请求并删除该字段。如果格式正确或为空值,它会按预期工作,但如果格式错误,则会抛出错误“无法将 :string 强制转换为 :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)         
    }

标签: mulemule-studiodataweavemulesoft

解决方案


问题是,当尝试使用不匹配的模式解析输入日期时,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 中没有等价物。作为替代方案,您可以使用以下方法之一:

  • 将每个可能失败的表达式隔离到单独的脚本中,并将其封装到可以捕获表达式的错误处理程序中。
  • 使用此知识库文章中描述的方法,使用条件保护每个模式转换,并在尝试之前尝试测试模式是否匹配。例子(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"})

推荐阅读