使用 Salesforce 特性与 Apex
Salesforce 用户界面的许多特性在 Apex 中暴露,以便你可以通过编程方式访问。例如:向 Chatter feed 发布内容、使用审批方法提交和审批流程请求、使用 Apex Cursors 处理大数据、通过 Connect in Apex 访问 B2B Commerce 和 CMS 管理内容、通过 External Services 进行类型安全的 callout、使用 DataWeave 进行数据转换、管理 Salesforce Knowledge 文章、自动化 Territory Management 2.0 等。
Actions:Apex 中的快速操作
快速操作可添加到 Salesforce Classic 主页、Chatter 选项卡、Chatter 组和记录详情页。有两种类型:创建操作(让用户创建记录——New Contact、New Opportunity、New Lead)和自定义操作(调用 Lightning 组件、Flow、Visualforce 页面或画布应用)。创建操作、Log a Call 和自定义操作可以是对象特定或全局的。更新操作必须是对象特定的。
Apex 通过 Quick Action API 支持以编程方式调用快速操作。使用 QuickAction.QuickActionRequest 类构建操作请求——指定 actionName、上下文 sObject ID、字段值。使用 QuickAction.performQuickAction / QuickAction.performQuickActions 方法执行。相关类:QuickActionResult、DescribeQuickActionResult、DescribeAvailableQuickActionResult 等。
Apex Cursors:大数据处理
Apex Cursors 让你将 SOQL 查询结果分成小块在单个事务边界内处理——不实际返回整个结果集。你可以向前和向后遍历结果集。包开发者和高级开发者可以使用 Cursors 处理高容量和高资源消耗的处理作业。与链式 Queueable Apex 作业结合使用是 Batch Apex 的有力替代方案——解决了 Batch Apex 的一些限制(如 Flex Queue 限制、最多 5 个活跃 Batch 的限制)。
Cursor 的关键特性:
- 无状态:从指定的偏移位置生成结果——必须在处理场景中自己跟踪偏移量或位置
- 通过
Database.getCursor()或Database.getCursorWithBinds()创建——执行 SOQL 查询时创建 Cursor.fetch(position, count)从指定偏移获取指定数量的行——最多每次获取 200 行- 最多 5,000 万行每个 cursor(无论是同步还是异步)
Cursor.getNumRecords()获取 cursor 返回的总行数- Cursor 在创建时建立固定的结果记录 ID 集合——创建后的记录更新(即使记录不再满足 WHERE 子句)不改变结果集。同样的,后续的共享规则更改也不改变结果集
- 每次
Cursor.fetch()调用计入 SOQL 查询限制,获取的行计入 SOQL 查询行限制。最多 100 次 fetch 调用每事务 - 异常类型:
System.FatalCursorException(不可重试)和System.TransientCursorException(可重试的事务)
Pagination Cursors:Database.getPaginationCursor() 创建分页游标。使用 fetchPage(start, pageSize) 返回 Database.CursorFetchResult 对象——封装了检索到的行(getRecords())、跳过的已删除行数(getDeletedRows())、下一页索引(getNextIndex())和是否完成标志(isDone())。
Limit 监控方法:Limits.getApexCursorRows()、Limits.getFetchCallsOnApexCursor()、Limits.getApexCursors()、Limits.getApexPaginationCursors() 及其对应的 getLimit 方法。组织和每日限制可通过 OrgLimits.getMap() 获取。
Apex Cursors:代码示例
结合 Queueable 使用 Cursor 处理大数据——每批获取 200 条记录,链式继续直到全部处理完成:
public with sharing class QueryChunkingQueueable implements Queueable {
private Database.Cursor locator;
private Integer position;
public QueryChunkingQueueable() {
locator = Database.getCursor(
'SELECT Id FROM Contact WHERE LastActivityDate = LAST_N_DAYS:400',
AccessLevel.USER_MODE);
position = 0;
}
public void execute(QueueableContext ctx) {
Integer remainingRows = locator.getNumRecords() - position;
if (remainingRows == 0) return;
Integer fetchSize = Math.min(200, remainingRows);
List<Contact> scope = locator.fetch(position, fetchSize);
position += scope.size();
// 处理 scope 中的记录(归档、删除等)
if (position < locator.getNumRecords()) {
System.enqueueJob(this); // 链式继续
}
}
}
审批处理
审批流程自动化 Salesforce 中的记录审批方式——指定每个审批步骤,包括向谁请求审批以及每个环节执行什么操作。Apex 提供以下核心类:
- ProcessRequest 类——所有审批请求的基类
- ProcessSubmitRequest——提交记录进行审批。设置 objectId、submitterId、processDefinitionNameOrId、skipEntryCriteria 等属性
- ProcessWorkitemRequest——处理审批工作项(批准/拒绝/重新分配)。设置 workitemId、action、comment、nextApproverIds 等
- ProcessResult——包含审批操作的结果——isSuccess、getActorIds、getNewWorkitemIds、getInstanceId 等
// 提交审批
Approval.ProcessSubmitRequest req = new Approval.ProcessSubmitRequest();
req.setObjectId(recordId);
req.setProcessDefinitionNameOrId('Expense_Approval');
req.setSkipEntryCriteria(false);
Approval.ProcessResult result = Approval.process(req);
// 批准工作项
Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest();
req2.setWorkitemId(workItemId);
req2.setAction('Approve');
req2.setComments('Approved by manager');
Approval.ProcessResult result2 = Approval.process(req2);
审批记录被锁定——使用 Approval.lock() / Approval.unlock()。使用 Approval.isLocked(recordId) 检查。审批操作在调用用户的上下文中执行,强制执行该用户的权限。
认证:自定义认证提供程序插件
Salesforce 提供多种用户认证方式——构建适合组织需求和用户使用模式的认证方法组合。创建自定义认证提供程序——实现 Auth.AuthProviderPluginClass 接口。支持多种认证协议:OAuth 2.0、OpenID Connect、SAML。方法包括:getUserInfo(获取用户信息)、handleCallback(处理认证回调)、initiate(发起认证流程)、refresh(刷新令牌)。通过 Setup → Auth. Providers 配置自定义认证提供程序,并与社区或门户集成,使组织能够与外部身份系统对接。
认证:OAuth 2.0 令牌交换处理器
实现 Auth.TokenExchangeHandler 接口自定义 OAuth 2.0 令牌交换逻辑——将外部身份令牌(如 Google/Facebook 令牌)交换为 Salesforce 会话令牌。支持 JSON Web Token (JWT) 和 SAML 断言格式。典型场景:移动应用使用社交登录后通过令牌交换获取 Salesforce 访问权限;微服务间的服务到服务认证;将企业 SSO 系统连接到 Salesforce。
平台特性:DataWeave、外部服务等
DataWeave in Apex:使用 Mulesoft DataWeave 库读取、转换和导出不同格式的数据(CSV↔JSON↔XML)。DataWeave 脚本作为元数据创建,直接从 Apex 调用——在 Salesforce 应用服务器内运行,强制执行与 Apex 相同的堆和 CPU 限制。
External Services:连接外部服务后可在 Apex 中原生、类型安全地调用——注册 API 规范中的对象和操作变为 ExternalService 命名空间中的 Apex 类和方法。不需要使用 Http 类或手动 JSON 转换。模式类型映射到 Apex 类型——编译器进行类型检查。
其他特性:Chatter in Apex(通过 ConnectApi 命名空间管理 Feed、组和成员)、Territory Management 2.0(Territory2 和 UserTerritory2Association 对象触发器支持)、Platform Cache(全局和组织级缓存提高性能)、Salesforce Knowledge(通过 Apex 管理文章)、Formula Evaluation in Apex(动态公式求值——支持 sObject 和 Apex 对象作为上下文)、Permission Set Groups 测试支持、Salesforce Files 自定义行为等。
Salesforce 平台提供丰富的特性——从审批到认证、从大数据游标到数据转换工具和类型安全的外部服务调用——通过 Apex 以编程方式访问这些特性可以实现深度自动化和高效集成。