dwl 1.0(Mule 3)如何过滤无效/空日期字段 解决格式转换报错
DataWeave 1.0(Mule3)日期格式校验报错解决方案
问题根因
现有代码仅校验了字段非空,未处理格式非法的场景,强制进行日期类型转换时,格式不匹配就会抛出Cannot coerce a :string to a :localdatetime类型强制转换错误。
解决方案
核心使用DataWeave 1.0的安全转换语法,即类型转换后加?后缀,转换失败时返回null而非抛出异常,再配合动态字段条件判断,仅保留转换成功的字段,自动过滤空值、格式非法的字段。
注意:示例输入的日期格式为
年-月-日,原代码转换函数里的dd/MM/yyyy格式和输入不匹配,需要先调整为对应格式,如果实际业务输入是日/月/年的格式,改回原format值即可,安全转换逻辑无需调整。
修正后代码
%dw 1.0 %output application/java // 安全转换日期:格式不匹配/输入为空则返回null %function transformDate(dt) (dt as :date {format: "yyyy-MM-dd"}? as :string {format: "yyyy-MM-dd"}) // 安全转换日期时间:格式不匹配/输入为空则返回null %function changeDateTime(cdt) (cdt as :localdatetime {format: "yyyy-MM-dd HH:mm:ss"}? as :string {format: "yyyy-MM-dd HH:mm:ss"}) // 校验转换结果是否有效 %function isValid(res) (res != null and res != "") --- { (date1: changeDateTime(payload.date1)) when isValid(changeDateTime(payload.date1)), (date2: transformDate(payload.date2)) when isValid(transformDate(payload.date2)), (date3: transformDate(payload.date3)) when isValid(transformDate(payload.date3)), (date4: changeDateTime(payload.date4)) when isValid(changeDateTime(payload.date4)), (date5: transformDate(payload.date5)) when isValid(transformDate(payload.date5)), (date6: transformDate(payload.date6)) when isValid(transformDate(payload.date6)) }
逻辑说明
- 类型转换后的
?是DataWeave 1.0原生安全转换语法,转换逻辑抛出异常时直接返回null,不会中断整个流程 - 动态字段语法
(字段名: 值) when 条件:条件不满足时该字段不会出现在最终输出中,自动过滤不符合要求的字段 - 若需要输出日期对象而非字符串,去掉转换函数末尾的
as :string部分即可。
内容的提问来源于stack exchange,提问作者Devendra
相关产品推荐
相关产品推荐

