DataWeave in Apex

Posted by Peter Dong on February 2, 2023

在 Apex 中处理基于文本的数据是一项相当普遍的任务, 尤其是在系统集成中. 然而, 处理 JSON,XML和 CSV 往往需要写大量的代码, 并且也会导致性能问题, Salesforce 目前推出了 DataWeave in Apex(截至2月2号, 仍处于测试阶段). DataWeave in Apex 的目标是能够在 Salesforce 中允许我们用 MuleSoft 的转换语言来处理文本数据. 只需几行代码, 就可以用 DataWeave 脚本处理所有常见的文本数据格式. 与 Apex 一样, DataWeave 脚本在 Salesforce 应用服务器内运行, 对执行的代码执行相同的堆(Heap)和 CPU 限制.

DataWeave in Apex 是什么?

企业应用程序经常需要在 CSV, JSON, XML 与 Apex 对象等格式之间进行数据转换. Apex 中的 DataWeave 补充了 Apex 对 JSON 和 XML 处理的本地支持, 并使数据转换更容易编码, 更具可扩展性和效率. Apex 的开发人员可以更专注于解决业务问题, 而不是解决文件格式的具体问题. 而且你不需要成为 MuleSoft 的客户, 也不需要拥有任何特定的 Salesforce 许可证, 就可以在 Apex 中使用 DataWeave.

创建和部署一个简单的 DataWeave 项目

首先,我们需要创建一个 SFDX Project, 再连接一个 dev hub org, 之后在项目的 force-app/main/default 路径下创建一个文件夹 dw. 在这个文件夹里, 我们需要创建两个文件.

json2sObjects.dwl

1
2
3
4
5
6
7
8
%dw 2.0
input incomingJson application/json
output application/json
---
incomingJson map {
    Company: $.title.rendered,
    FirstName: $.author
}

json2sObjects.dwl-meta.xml

1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<DataWeaveResource xmlns="http://soap.sforce.com/2006/04/metadata">
     <apiVersion>56.0</apiVersion>
</DataWeaveResource>

img

代码创建完成之后, 从终端运行一个命令, 将代码推送到我们的scratch org中.

1
sfdx force:source:push --json --loglevel fatal

img

创建 Apex Class

文件创建完成之后, 我们需要创建一个 Apex Class, 这个class的作用是从一个公共的 REST API 中提取数据,将 response 响应传入一个 DataWeave 脚本, 并获取和序列化response. 确保能够将配置的 dwl 文件中的字段映射到指定的字段上去.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class DataWeaveInApex {

    private String incomingJson;
    
    public void consume(){
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint('https://techcrunch.com/wp-json/wp/v2/posts?per_page=2');
        request.setMethod('GET');
        HttpResponse response = http.send(request);
        if(response.getStatusCode() == 200) {
            incomingJson = response.getBody();
            List<Lead> leads = (List<Lead>) translateToSObjects('Lead');
            System.debug('lead size: ' + leads.size());
            System.debug('lead results: ' + leads);
        }
    }

    public String translate() {
        Map<String, Object> parameters = new Map<String, Object>();
        parameters.put('incomingJson', incomingJson);
        DataWeave.Script script = DataWeave.Script.createScript(
            'json2sObjects'
        );
        DataWeave.Result result = script.execute(parameters);
        return result.getValueAsString();
    }

    public List<sObject> translateToSObjects(String sObjectType) {
        Type dynamicListType = Type.forName('List<' + sObjectType + '>');
        return (List<sObject>) JSON.deserialize(translate(), dynamicListType);
    }
}

img

在使用 DataWeave 的时候的一些考量或限制

  • 目前每个 Org 支持最多 50 个 DataWeave 脚本.
  • 在初始化 DataWeave 的时候会大量消耗 CPU 的时间
  • Apex 类必须在 API 版本 53.0 或更高版本才能访问 DataWeave 集成方法。
  • 一个 DataWeave 脚本的最大 body size 是 100000 个字符。
  • DataWeave in Apex 不支持这些 content types :
    • Flat File Format (application/flatfile)
    • Excel (application/xlsx)
    • Arvo (application/avro)

Buy Me a Coffee