ConnectApi 类、DataWeave、Data 360 与平台特性
本章涵盖 ConnectApi 输入/输出类的使用、限制、打包、序列化、版本管理和测试,以及 Chatter 私信审核、Data 360 SOQL 查询与 Mock 测试、DataWeave 数据转换和 Feed 项审核等平台特性。
ConnectApi 输入/输出、限制与更多
输入/输出类:ConnectApi 方法接受简单类型(原始类型)或复杂类型(ConnectApi 输入对象)。成功执行返回输出对象——输出对象可由其他输出对象组成。18 字符 ID:ConnectApi 输出对象中所有 Salesforce ID 为 18 字符——输入对象可使用 15 或 18 字符。
限制:每个 ConnectApi 写操作 = 1 DML 语句。大多数调用计入 24 小时 API 请求。需要 Chatter 的方法受每小时每用户每命名空间速率限制——超出抛 ConnectApi.RateLimitException 需捕获处理。测试时 Test.startTest() 启动新速率计数——stopTest() 恢复原计数。
打包:ConnectApi 类依赖 Chatter 的代码可在未启用 Chatter 的 org 中编译安装——但运行时抛 System.NoAccessException。每个方法文档标明是否支持 Chatter。
序列化/反序列化:JSON 结构与 Connect REST API 一致。支持 JSON/JSONParser 类、@RestResource Apex REST 和 @RemoteAction JS Remoting。仅输出对象可序列化——仅顶级输入对象可反序列化。枚举和异常不可序列化。
版本管理:ConnectApi 调用在执行类的版本上下文中运行——类比 Connect REST API 的 /vXX.X。输出对象暴露 getBuildVersion() 方法。输入对象只能访问执行类版本支持的非 null 属性——包含版本不匹配属性则抛异常。JSON 序列化/反序列化仅包括/接受版本匹配的属性。枚举不进行版本管理——所有 API 版本中返回所有枚举值。
相等性检查:输入对象比较属性;输出对象比较属性和 build 版本(相同属性值但不同 build 版本的对象不相等)。
类型转换(Casting):下转型到具体子类型——对 MessageSegment(→MentionSegment/HashtagSegment)、FeedItemCapability 和 AbstractRecordField 尤其有用。使用 instanceof 检查然后安全转换——必须包含 default 分支处理未知子类(Feed 组成在发布间可能变化)。
通配符搜索:* 匹配零或多个字符(中/尾部)——? 仅匹配一个字符。转义用 \。搜索越聚焦结果越快——prospect* 比 prosp* 更好。标点符号被索引——搜索 * 或 ? 用引号包围并转义。
测试:Connect in Apex 在上下文用户模式下运行——不支持 runAs 方法。大多数需要真实 org 数据——测试方法需标记 @IsTest(SeeAllData=true)。getFeedElementsFromFeed 等方法不允许在测试中访问 org 数据——需使用 setTest 方法注册输出对象(不同重载有不同 setTest 签名)。构建数据→注册(调用 setTest 方法)→运行常规方法→验证返回注册数据。
与其他 Apex 类的差异:忽略 with/without sharing 关键字(上下文用户控制所有安全);某些操作异步(添加 Feed 项/照片不会立即可用);Apex REST 不支持 Connect in Apex 对象 XML 序列化;日志中无 VARIABLE_ASSIGNMENT;不可用 webservice 关键字。
Data 360、DataWeave 与审核
Chatter 私信审核:对 ChatterMessage 编写 before insert 触发器——审核消息正文和发件人信息。调用 addError() 阻止违规消息。ChatterMessage 字段:Id、Body(正文)、SenderId(发件人)、SentDate、SendingNetworkId(Experience Cloud 站点)。所需权限:Author Apex + Manage Chatter Messages and Direct Messages。
Data 360 in Apex:静态 SOQL 支持 DMO(Data 360 数据模型对象)。在 FOR 循环或 QueryLocator 中使用时 API 61.0+ 支持完整结果(更早版本仅返回前 201 条)。对 DMO 的静态 SOQL视为 callout——受与 HTTP callout 相同的限制(未提交 DML 时调用失败)。安全考量:所有数据空间中的 DMO 以系统模式访问——仅支持对象级读取检查(WITH USER_MODE/WITH SECURITY_ENFORCED 仅检查对象级)。使用 Schema.describeSObjects 而非 getGlobalDescribe() 发现 DMO。
Mock SOQL 测试(Data 360 DMO):扩展 System.SoqlStubProvider 重写 handleSoqlQuery()。使用 Test.createStubQueryRow/StubQueryRows 创建 DMO 实例。通过 Test.createSoqlStub 注册。Stub 实现中不允许 SOQL/SOSL/Callout/Future/Queueable/Batch/DML/Platform Events。Governor Limit 适用于 Stub 记录。
DataWeave in Apex:MuleSoft DataWeave 库——读取、转换、导出不同格式(CSV/JSON/XML/Apex 对象)。创建 .dwl 脚本作为元数据部署。使用 DataWeave.Script.createScript() 加载——execute() 返回 DataWeave.Result。每个脚本生成 DataWeaveScriptResource.ScriptName 内部类。异常类型:System.DataWeaveScriptException。日志:log(string, value) → Apex debug log 中 DATAWEAVE_USER_DEBUG 事件。脚本版本支持:API 61−/62/63+ → DataWeave 2.5/2.8/2.9。限制:Java 桥禁用、不支持模块导入、不支持 Flat File/Excel/Avro、最多 50 脚本/org、单脚本最大 100K 字符、无 XML Entity Expansion 防护。
Feed 项审核:对 FeedItem 编写 before insert 触发器——检查帖子正文是否包含不当短语。addError() 或设置 status 为 PendingReview。所需权限:Author Apex。
External Services:注册外部服务的 API 规范→操作变为 ExternalService 命名空间中强类型的 Apex 类和方法——无需使用 Http 类或手动 JSON 转换。
从 ConnectApi 的版本管理和测试到 DataWeave 数据转换和 Chatter 内容审核,这些平台特性为构建高级 Salesforce 应用提供了强大的工具链。