Apex中使用DataWeave:动态指定SObject类的问题
解决DataWeave动态指定Apex对象类名的问题
我有一段在Apex类中运行正常的DataWeave脚本,原本硬编码了Salesforce对象类名Requirement__c,现在想通过objectProperties输入的ObjectName变量动态指定类名,但直接替换后DataWeave将变量名当作字符串字面量处理,导致转换报错。
原脚本与输入数据
原DataWeave脚本
%dw 2.0 input csvData application/csv input fieldMappings application/json input objectProperties application/json var objectName = objectProperties.ObjectName output application/apex --- csvData map ((row) -> ( ( fieldMappings map (fieldMapping) -> (fieldMapping.target) : if(row[fieldMapping.source] != "") row[fieldMapping.source] else fieldMapping."defaultValue" ) reduce ($$ ++ $) ) as Object {class: "Requirement__c"} )
输入数据
- csvData内容:
First Name,Last Name,Title,Height,Color Jane, Austin, CEO,7,blue Bob, Smith, COO, 6,red
- fieldMappings内容:
[ { "source": "First Name", "target": "FirstName" }, { "source": "Last Name", "target": "LastName" }, { "source": "Title", "target": "Title" }, { "source": "Height", "target": "Height__c" }, { "source": "Importance", "target": "Priority__c" }, { "source": "Interests", "target": "Hobbies__c" } ]
- objectProperties内容:
{ "ObjectName":"Contact" }
解决方案
问题出在类型强制转换的class属性赋值逻辑上:默认情况下Object {class: "xxx"}里的内容属于字符串字面量上下文,直接写变量名会被当作字符串处理。只需用括号包裹变量,切换到表达式上下文即可让DataWeave解析变量的实际值。
修改后的核心代码
将硬编码的类名替换为带括号的变量:
) as Object {class: (objectName)}
完整修改后的脚本
%dw 2.0 input csvData application/csv input fieldMappings application/json input objectProperties application/json var objectName = objectProperties.ObjectName output application/apex --- csvData map ((row) -> ( ( fieldMappings map (fieldMapping) -> (fieldMapping.target) : if(row[fieldMapping.source] != "") row[fieldMapping.source] else fieldMapping."defaultValue" ) reduce ($$ ++ $) ) as Object {class: (objectName)} )
原理说明
在DataWeave的类型注解中,括号()用于切换到表达式执行上下文,让引擎优先解析变量的实际值,而非将变量名直接作为字符串字面量使用,这样就能动态传入objectName对应的Salesforce对象类名,正确生成目标Apex对象。
内容的提问来源于stack exchange,提问作者caleb
相关产品推荐
相关产品推荐

