使用 Salesforce 特性与 Apex 集成

Salesforce特性与Apex集成完全指南:快速操作(QuickAction.Request/performQuickAction/创建操作vs自定义操作对象特定vs全局)、Apex Cursors大数据游标(无状态/固定结果集ID/5千万行限制/100次fetch事务/TransientCursorException可重试/PaginationCursor分页游标/CursorFetchResult封装/致Limits监控方法/每日OrgLimits)、审批处理(ProcessSubmitRequest提交/ProcessWorkitemRequest批准拒绝/Approval.process/lock/unlock)、自定义认证提供程序(Auth.AuthProviderPluginClass/OAuth2.0+OpenID+SAML)、OAuth2.0令牌交换处理器(Auth.TokenExchangeHandler/JWT+SAML断言)、DataWeave数据转换、External Services类型安全调用、Formula Evaluation动态公式、Platform Cache及更多平台特性。...

📅 2026/7/16 ✍️ ponybai 🏷️ apex, salesforce

使用 Salesforce 特性与 Apex

Salesforce特性

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

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:代码示例

Cursor示例

结合 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 令牌交换处理器

OAuth令牌交换

实现 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 以编程方式访问这些特性可以实现深度自动化和高效集成。