如何使用DataWeave 2.0限制无DTOSteps子节点的DTOCoverageItem更新
解决DataWeave 2.0中仅更新含DTOSteps子节点的DTOCoverageItem的FullTermAmt问题
要实现仅当DTOCoverageItem节点包含DTOSteps子节点时,才更新其FullTermAmt属性的需求,核心是在更新逻辑中增加节点存在性的判断。以下是修正后的DataWeave 2.0代码及说明:
修正后的代码示例
%dw 2.0 output application/json // 假设请求中的更新值来自payload.request.FullTermAmt,可根据实际数据源调整 var targetFullTermAmt = payload.request.FullTermAmt --- payload.target update { case coverageItems at .DTOCoverageItems -> coverageItems map (item) -> // 检查当前DTOCoverageItem是否存在DTOSteps子节点 if (item.DTOSteps? ) item update { case amt at .FullTermAmt -> targetFullTermAmt } else item // 无DTOSteps时保持原节点不变 }
关键逻辑说明
- 节点存在性判断:使用
item.DTOSteps?操作符检查当前DTOCoverageItem是否包含DTOSteps子节点,?是DataWeave中用于判断属性是否存在的原生语法。 - 条件更新:仅当判断为真时,执行FullTermAmt的赋值操作;不满足条件时直接返回原节点,避免误更新。
- 严格校验扩展:如果业务要求DTOSteps必须是非空数组,可将判断条件修改为:
if (item.DTOSteps != null and sizeOf(item.DTOSteps) > 0)
输入输出示例
输入数据(目标结构+请求更新值)
{ "target": { "DTOCoverageItems": [ { "FullTermAmt": 100, "DTOSteps": [{"StepId": "S001"}] }, { "FullTermAmt": 200 }, { "FullTermAmt": 300, "DTOSteps": [] } ] }, "request": { "FullTermAmt": 500 } }
输出结果(仅含DTOSteps的节点被更新)
{ "target": { "DTOCoverageItems": [ { "FullTermAmt": 500, "DTOSteps": [{"StepId": "S001"}] }, { "FullTermAmt": 200 }, { "FullTermAmt": 500, "DTOSteps": [] } ] } }
若使用严格校验条件(排除空数组),第三个节点的FullTermAmt将保持300不变。
内容的提问来源于stack exchange,提问作者LoveMuleSoft
相关产品推荐
相关产品推荐

