Apex 定义的数据类型
通过 Apex 定义的数据类型,流可以操纵通常从对 Web 服务调用返回的各种复杂数据对象。在流中创建 Apex 定义的变量,并直接处理从 Web 调用返回的 JSON。
所需的 Edition
| 查看支持的版本。 |
开发人员可以定义 Apex 类,以用作从 Web 到流自动转换的模式,并允许使用声明性方法完全操纵在流中执行的结果对象,无需其他代码。对于将流连接到通过 Mulesoft 和 REST 调用访问的丰富外部 Web 对象,Apex 定义的资源非常有用。如果不支持数据类型,流可将值传输到 Lightning 组件,您可以使用 Apex 对其进行操作。
使用 Apex 定义的数据类型扩展流
对于通常从调用 Web 服务返回的复杂数据对象的业务流程,您可以使用 Apex、流和 Lightning 组件组合将其自动化。例如,获取有关 Web 产品的外部产品数据,然后在 Salesforce 中创建记录。
对 REST 端点的调用将返回具有产品数据的 JSON 响应。
{
"model": "Vintage Cruiser Jacket",
"brand": "Acme",
"identifiers": [
{
"SKU": "A-J001"
},
{
"SKU": "A-J002"
},
{
"SKU": "A-J003"
}
],
"price": {
"amount": {
"currencyValue": "500.00",
"name": "Amount",
"currency": "USD"
},
"salesUnit": {
"code": "EA",
"name": "Each"
}
}
}
使用 Apex 类建模 JSON 对象
在 Apex 类中,定义复杂数据对象。例如,您可为 JSON 对象创建匹配 Apex 类。类用作模板,并将 JSON 转换为流可以使用的对象。
在定义 Web 产品的 Apex 类后,您可以创建 Apex 操作,以使用 REST 调用从 Web 服务获取数据。对于使用 Apex 定义的数据类型的流变量,将在其中存储返回的数据。然后,对流、Apex 和 Lightning 组件中的数据执行操作。
以下是 WebProduct Apex 模板的示例。它包含主要WebProduct类以及Price和Identifiers的类。WebProduct有三种类型的数据。
- model 和 brand 字段使用基元字符串数据类型。
- 价格字段引用
Price类。请确保将每个类保存在单独的类文件中,因为流的 Apex 定义的数据类型不支持内部类。 - identifiers 字段与 price 相似,但代表为列表。
Identifiers类允许流访问 JSON 数组,以表示三个特定 SKU 编号的列表。 parse方法将 JSON 转换为流程可访问的 Apex 对象。- 流的 Apex 类中的字段需要
@AuraEnabled注解。
public class WebProduct {
@AuraEnabled
public String model;
@AuraEnabled
public String brand;
//Because the identifiers information is an array in the JSON schema, we create a separate class called Identifiers and define a property that contains a List.
@AuraEnabled
public List<Identifiers> identifiers;
//This field has an Apex-defined data type in the Price Apex class.
@AuraEnabled
public Price price;
//This method is used as part of the Create Apex Action section.
public static WebProduct parse(String json) {
return (WebProduct) System.JSON.deserialize(json, WebProduct.class);
}
Identifiers Apex 类定义了 SKU 字段。
public class Identifiers {
@AuraEnabled
public String SKU;
}
Price Apex 类定义了金额和 salesUnit 字段。
public class Price {
//This field has an Apex-defined data type in the Amount Apex class.
@AuraEnabled
public Amount amount;
//This field has an Apex-defined data type in the SalesUnit Apex class.
@AuraEnabled
public SalesUnit salesUnit;
}
Amount Apex 类定义了 currencyValue、name 和 currency 字段。
public class Amount {
@AuraEnabled
public String currencyValue;
@AuraEnabled
public String name;
@AuraEnabled
public String currency;
}
SalesUnit Apex 类定义了代码和名称字段。
public class SalesUnit {
@AuraEnabled
public String code;
@AuraEnabled
public String name;
}
创建 Apex 操作
在创建将 JSON 数据转换为流资源的机制后,您可以创建检索 JSON 数据的 Apex 类。使用@InvocableMethod注解将类定义为流的 Apex 操作。
GetWebProduct Apex 类定义了 Apex 操作。它从 REST 端点获取产品数据,并将 JSON 响应解析为 WebProduct Apex 对象。
从 API 版本 66.0 开始,用作可调用操作参数的自定义 Apex 类需要可访问的无参数构造函数。在此示例中,请求和结果内部类未定义任何构造函数,因此 Apex 提供隐式无参数构造函数。如果您向这些类添加其他构造函数,类需要具有适当访问修改符(公共或全局)的显式无参数构造函数。
开发人员可以通过创建 InvocableActionExtension 元数据文件来自定义此 Apex 操作在 Flow Builder 中的显示方式。此元数据允许您控制输入顺序和分组,添加自定义标题,定义输入参数的选项列表,并为特定输入创建自定义属性编辑器。有关更多信息,请查看元数据 API 开发人员指南中的“InvocableActionExtension”。
global with sharing class GetWebProduct {
@InvocableMethod
public static List<Results> GetWebProduct(List<Requests> requests)
{
Http http = new Http();
HttpRequest request = new HttpRequest();
String endpoint = requests[0].endpoint;
String submittedId = requests[0].submittedId;
request.setEndpoint(endpoint + submittedId );
request.setMethod('GET');
HttpResponse response = http.send(request);
Results curResult = new Results();
String responseJSON = response.getBody();
WebProduct curProduct = WebProduct.parse(responseJSON);
curResult.WebProduct = curProduct;
List<Results> resultsList = new List<Results>();
resultsList.add(curResult);
return resultsList;
}
global class Requests {
@InvocableVariable
global String submittedId;
@InvocableVariable
global String endpoint;
}
global class Results {
@InvocableVariable
global WebProduct WebProduct;
}
}
本示例使用全局访问权限修改器,因为它专为受管软件包场景设计。如果您创建 Apex 操作只是为了在您的组织中使用,您可以使用公用,而不是全局。
配置 Apex 操作
将 Apex 操作添加到屏幕流,并配置输入。
获取 Web 产品 Apex 操作自动将 Web 产品数据存储到 {!Get_Web_Product} 中。
现在,您可对流、Apex 和 Lightning 组件中的数据执行操作。例如,通过循环标识符和组合产品集合构建流,以生成产品数据。将记录集合保存到 Salesforce,并在流屏幕组件中显示数据。
将自定义图标添加到 Apex 定义操作
将自定义图标添加到 Apex 定义的可调用操作中,以使其更易在 Flow Builder 画布中找到。
自定义图标可以是 SVG 文件或现有 Salesforce Lightning 设计系统 (SLDS) 图标。
SVG 文件必须满足这些要求。
- 文件中的
<svg>元素包括id、xmlns和viewBox属性。 - 文件中的
<svg>元素不包括style、height和width属性。 - 文件不包含
<clipPath>元素。 - 文件中的每个
<path>元素都包括一个fill属性。
例如,支持此 SVG 文件作为自定义图标。
<svg id="top" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path fill="#673ab7" d="M12,44c-1.657,0-3-1.343-3-3V7c0-1.657,1.343-3,3-3h16l11,11v26c0,1.657-1.343,3-3,3H12z"/><path fill="#5e35b1" d="M39 15L28.883 14.125 39 24.124z"/><path fill="#b39ddb" d="M39,15h-8c-1.657,0-3-1.343-3-3V4L39,15z"/><path fill="#f5f5f5" d="M22 23H32V25H22zM22 28H32V30H22zM22 33H32V35H22zM17.5 22.5A1.5 1.5 0 1 0 17.5 25.5 1.5 1.5 0 1 0 17.5 22.5zM17.5 27.5A1.5 1.5 0 1 0 17.5 30.5 1.5 1.5 0 1 0 17.5 27.5zM17.5 32.5A1.5 1.5 0 1 0 17.5 35.5 1.5 1.5 0 1 0 17.5 32.5z"/></svg>仅支持标准对象和自定义对象 SLDS 图标作为 Apex 定义的可调用操作的自定义图标。
- 如果您使用的是 SVG 文件,请在贵组织中将该文件作为静态资源上传。
- 将可调用操作的
InvocableMethod注释的iconName属性设置为图标的名称。
对于 SVG 图标,将名称指定为 resource:namespace__iconName:svgID。例如:
public class CustomSvgIcon {
@InvocableMethod(iconName='resource:google:top')
public static void run() {}
}public class CustomSvgIcon {
@InvocableMethod(label='myIcon' iconName='resource:myPackageNamespace__google:top')
global static List<Integer> myMethod(List<Integer> request) {
List<Integer> results = new List<Integer>();
results.add(1);
return results;
}-
iconName 是您在上传图标时指定的名称。
-
svgID 是 SVG 文件中 <svg> 元素的
id属性的值。 -
Namespace 是软件包的命名空间,包含要自定义的可调用操作。如果可调用操作在受管软件包中,则 namespace__是必填前缀。否则,它是可选项。要对受管软件包中的可调用操作使用自定义图标,请将定义可调用操作的方法声明为
global。
对于 SLDS 图标,将名称指定为 slds:category:name。例如:
public class CustomSldsIcon {
@InvocableMethod(iconName='slds:standard:choice')
public static void run() {}
}- category 是图标类别的名称。
- name 是 SLDS 中文件的名称。
当用户在 Flow Builder 中添加可调用操作时,自定义图标将显示在 Flow Builder 画布上以表示它。

