building-omnistudio-callable-apex

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

building-omnistudio-callable-apex: Callable Apex for Salesforce Industries Common Core

building-omnistudio-callable-apex: 面向Salesforce Industries Common Core的Callable Apex

Specialist for Salesforce Industries Common Core callable Apex implementations. Produce secure, deterministic, and configurable Apex that cleanly integrates with OmniStudio and Industries extension points.
专注于Salesforce Industries Common Core的Callable Apex实现。生成安全、可预测且可配置的Apex代码,与OmniStudio及Industries扩展点实现无缝集成。

Scope

适用范围

  • In scope: Creating
    System.Callable
    classes for Industries extension points; reviewing callable implementations for correctness and risks; migrating
    VlocityOpenInterface
    /
    VlocityOpenInterface2
    to
    System.Callable
    ; 120-point scoring and validation
  • Out of scope: Generic Apex classes without callable interface (use
    generating-apex
    ); building Integration Procedures (use
    building-omnistudio-integration-procedure
    ); authoring OmniScripts (use
    building-omnistudio-omniscript
    ); deploying Apex classes (use
    deploying-metadata
    )

  • 包含场景:为Industries扩展点创建
    System.Callable
    类;评审可调用实现的正确性与风险;将
    VlocityOpenInterface
    /
    VlocityOpenInterface2
    迁移至
    System.Callable
    ;120分评分与验证
  • 排除场景:无Callable接口的通用Apex类(请使用
    generating-apex
    技能);构建集成流程(请使用
    building-omnistudio-integration-procedure
    技能);编写OmniScript(请使用
    building-omnistudio-omniscript
    技能);部署Apex类(请使用
    deploying-metadata
    技能)

Core Responsibilities

核心职责

  1. Callable Generation: Build
    System.Callable
    classes with safe action dispatch
  2. Callable Review: Audit existing callable implementations for correctness and risks
  3. Validation & Scoring: Evaluate against the 120-point rubric
  4. Industries Fit: Ensure compatibility with OmniStudio/Industries extension points

  1. 可调用类生成:构建具备安全动作分发机制的
    System.Callable
  2. 可调用类评审:审核现有可调用实现的正确性与风险点
  3. 验证与评分:基于120分评估标准进行校验
  4. Industries适配性:确保与OmniStudio/Industries扩展点的兼容性

Workflow (4-Phase Pattern)

工作流程(四阶段模式)

Phase 1: Requirements Gathering

阶段1:需求收集

Ask for:
  • Entry point (OmniScript, Integration Procedure, DataRaptor, or other Industries hook)
  • Action names (strings passed into
    call
    )
  • Input/output contract (required keys, types, and response shape)
  • Data access needs (objects/fields, CRUD/FLS (Create/Read/Update/Delete and Field-Level Security) rules)
  • Side effects (DML, callouts, async requirements)
Then:
  1. Scan for existing callable classes:
    Glob: **/*Callable*.cls
  2. Identify shared utilities or base classes used for Industries extensions
  3. Create a task list

需询问以下信息:
  • 入口点(OmniScript、集成流程、DataRaptor或其他Industries钩子)
  • 动作名称(传入
    call
    方法的字符串)
  • 输入/输出契约(必填键、类型及响应结构)
  • 数据访问需求(对象/字段、CRUD/FLS(创建/读取/更新/删除及字段级安全)规则)
  • 副作用(DML操作、外部调用、异步需求)
完成询问后:
  1. 扫描现有可调用类:
    Glob: **/*Callable*.cls
  2. 识别用于Industries扩展的共享工具类或基类
  3. 创建任务清单

Phase 2: Design & Contract Definition

阶段2:设计与契约定义

Define the callable contract:
  • Action list (explicit, versioned strings)
  • Input schema (required keys + types)
  • Output schema (consistent response envelope)
Recommended response envelope:
{
  "success": true|false,
  "data": {...},
  "errors": [ { "code": "...", "message": "..." } ]
}
Action dispatch rules:
  • Use
    switch on action
  • Default case throws a typed exception
  • No dynamic method invocation or reflection
VlocityOpenInterface / VlocityOpenInterface2 contract mapping:
When designing for legacy Open Interface extensions (or dual Callable + Open Interface support), map the signature:
invokeMethod(String methodName, Map<String, Object> inputMap, Map<String, Object> outputMap, Map<String, Object> options)
ParameterRoleCallable equivalent
methodName
Action selector (same semantics as
action
)
action
in
call(action, args)
inputMap
Primary input data (required keys, types)
args.get('inputMap')
outputMap
Mutable map where results are written (out-by-reference)Return value; Callable returns envelope instead
options
Additional context (parent DataRaptor/OmniScript context, invocation metadata)
args.get('options')
Design rules for Open Interface contracts:
  • Treat
    inputMap
    and
    options
    as the combined input schema
  • Define what keys must be written to
    outputMap
    per action (success and error cases)
  • Preserve
    methodName
    strings so they align with Callable
    action
    strings
  • Document whether
    options
    is required, optional, or unused for each action

定义可调用契约
  • 动作列表(明确的、带版本的字符串)
  • 输入 schema(必填键 + 类型)
  • 输出 schema(统一的响应信封)
推荐响应信封格式
{
  "success": true|false,
  "data": {...},
  "errors": [ { "code": "...", "message": "..." } ]
}
动作分发规则
  • 使用
    switch on action
    语法
  • 默认分支抛出类型化异常
  • 禁止动态方法调用或反射
VlocityOpenInterface / VlocityOpenInterface2契约映射
当为旧版Open Interface扩展设计(或同时支持Callable + Open Interface)时,需映射以下签名:
invokeMethod(String methodName, Map<String, Object> inputMap, Map<String, Object> outputMap, Map<String, Object> options)
参数作用Callable等效项
methodName
动作选择器(与
action
语义一致)
call(action, args)
中的
action
inputMap
主输入数据(必填键、类型)
args.get('inputMap')
outputMap
写入结果的可变映射(按引用传递输出)返回值;Callable返回响应信封替代此方式
options
附加上下文(父级DataRaptor/OmniScript上下文、调用元数据)
args.get('options')
Open Interface契约设计规则:
  • inputMap
    options
    视为组合输入schema
  • 定义每个动作需写入
    outputMap
    的键(成功与错误场景)
  • 保留
    methodName
    字符串,使其与Callable的
    action
    字符串对齐
  • 记录每个动作中
    options
    是必填、可选还是未使用

Phase 3: Implementation Pattern

阶段3:实现模式

Vanilla System.Callable (flat args, no Open Interface coupling):
Read
assets/pattern_callable_vanilla.cls
before generating — use when callers pass flat args and no VlocityOpenInterface integration is required.
Callable skeleton (same inputs as VlocityOpenInterface):
Read
assets/pattern_callable_openinterface.cls
before generating — use
inputMap
and
options
keys in
args
when integrating with Open Interface or when callers pass that structure.
Input format: Callers pass
args
as
{ 'inputMap' => Map<String, Object>, 'options' => Map<String, Object> }
. For backward compatibility with flat callers, if
args
lacks
'inputMap'
, treat
args
itself as
inputMap
and use an empty map for
options
.
Implementation rules:
  1. Keep
    call()
    thin; delegate to private methods or service classes
  2. Validate and coerce input types early (null-safe)
  3. Enforce CRUD/FLS (Create/Read/Update/Delete and Field-Level Security) and sharing (
    with sharing
    ,
    Security.stripInaccessible()
    )
  4. Bulkify when args include record collections
  5. Use
    WITH USER_MODE
    for SOQL when appropriate
  6. Namespace handling:
    System.Callable
    is a standard interface (no namespace prefix required);
    omnistudio.VlocityOpenInterface2
    uses the managed
    omnistudio
    package namespace — always qualify it. If the callable class will be deployed into a namespaced managed package, ask the user for the namespace prefix and apply it to custom class names (e.g.,
    myns__Industries_XxxCallable
    )
VlocityOpenInterface / VlocityOpenInterface2 implementation:
When implementing
omnistudio.VlocityOpenInterface
or
omnistudio.VlocityOpenInterface2
, use the signature:
apex
global Boolean invokeMethod(String methodName, Map<String, Object> inputMap,
                           Map<String, Object> outputMap, Map<String, Object> options)
Read
assets/pattern_openinterface.cls
before generating — complete
VlocityOpenInterface2
skeleton with
switch on
dispatch and
outputMap
contract.
Open Interface implementation rules:
  • Write results into
    outputMap
    via
    putAll()
    or individual
    put()
    calls; do not return the envelope from
    invokeMethod
  • Return
    true
    for success,
    false
    for unsupported or failed actions
  • Use the same internal private methods as the Callable (same
    inputMap
    and
    options
    parameters); only the entry point differs
  • Populate
    outputMap
    with the same envelope shape (
    success
    ,
    data
    ,
    errors
    ) for consistency
Both Callable and Open Interface accept the same inputs (
inputMap
,
options
) and delegate to identical private method signatures for shared logic.

原生System.Callable(扁平参数,无Open Interface耦合):
生成前请阅读
assets/pattern_callable_vanilla.cls
—— 适用于调用方传递扁平参数且无需集成VlocityOpenInterface的场景。
兼容VlocityOpenInterface的Callable骨架
生成前请阅读
assets/pattern_callable_openinterface.cls
—— 当集成Open Interface或调用方传递该结构时,在
args
中使用
inputMap
options
键。
输入格式:调用方传递的
args
格式为
{ 'inputMap' => Map<String, Object>, 'options' => Map<String, Object> }
。为兼容扁平参数的调用方,若
args
不含
'inputMap'
,则将
args
本身视为
inputMap
,并使用空映射作为
options
实现规则
  1. 保持
    call()
    方法简洁;将逻辑委托给私有方法或服务类
  2. 尽早验证并安全转换输入类型(空值安全)
  3. 强制执行CRUD/FLS(创建/读取/更新/删除及字段级安全)与共享规则(
    with sharing
    Security.stripInaccessible()
  4. 当参数包含记录集合时,实现批量处理
  5. 适当时在SOQL中使用
    WITH USER_MODE
  6. 命名空间处理
    System.Callable
    是标准接口(无需命名空间前缀);
    omnistudio.VlocityOpenInterface2
    使用托管包
    omnistudio
    的命名空间 —— 必须添加前缀。若可调用类将部署到带命名空间的托管包中,请询问用户命名空间前缀并应用到自定义类名(例如
    myns__Industries_XxxCallable
VlocityOpenInterface / VlocityOpenInterface2实现
实现
omnistudio.VlocityOpenInterface
omnistudio.VlocityOpenInterface2
时,使用以下签名:
apex
global Boolean invokeMethod(String methodName, Map<String, Object> inputMap,
                           Map<String, Object> outputMap, Map<String, Object> options)
生成前请阅读
assets/pattern_openinterface.cls
—— 完整的
VlocityOpenInterface2
骨架,包含
switch on
分发与
outputMap
契约。
Open Interface实现规则:
  • 通过
    putAll()
    或单个
    put()
    调用将结果写入
    outputMap
    ;不要从
    invokeMethod
    返回响应信封
  • 成功时返回
    true
    ,不支持或失败的动作返回
    false
  • 使用与Callable相同的内部私有方法(相同的
    inputMap
    options
    参数);仅入口点不同
  • 为保持一致性,在
    outputMap
    中填充相同的响应信封结构(
    success
    data
    errors
Callable与Open Interface接受相同的输入(
inputMap
options
),并委托给相同签名的私有方法以实现逻辑共享。

Phase 4: Testing & Validation

阶段4:测试与验证

Minimum tests:
  • Positive: Supported action executes successfully
  • Negative: Unsupported action throws expected exception
  • Contract: Missing/invalid inputs return error envelope
  • Bulk: Handles list inputs without hitting limits
Read
assets/pattern_test_class.cls
— complete test class skeleton (positive, negative, contract, bulk, and null-args cases) before generating tests.

最低测试要求:
  • 正向测试:支持的动作执行成功
  • 反向测试:不支持的动作抛出预期异常
  • 契约测试:缺失/无效输入返回错误信封
  • 批量测试:处理列表输入且不触发限制
请阅读
assets/pattern_test_class.cls
—— 生成测试前需完成测试类骨架(包含正向、反向、契约、批量及空参数场景)

Migration: VlocityOpenInterface to System.Callable

迁移:从VlocityOpenInterface到System.Callable

When modernizing Industries extensions, move
VlocityOpenInterface
or
VlocityOpenInterface2
implementations to
System.Callable
and keep the action contract stable.
Guidance:
  • Preserve action names (
    methodName
    ) as
    action
    strings in
    call()
  • Pass
    inputMap
    and
    options
    as keys in
    args
    :
    { 'inputMap' => inputMap, 'options' => options }
  • Return a consistent response envelope instead of mutating
    outMap
  • Keep
    call()
    thin; delegate to the same internal methods with
    (inputMap, options)
    signature
  • Add tests for each action and unsupported action
Read
assets/pattern_migration.cls
— annotated before/after migration example (VlocityOpenInterface2 → System.Callable) before starting migration work.

当对Industries扩展进行现代化改造时,将
VlocityOpenInterface
VlocityOpenInterface2
实现迁移至
System.Callable
并保持动作契约稳定。
迁移指南
  • 保留动作名称(
    methodName
    )作为
    call()
    中的
    action
    字符串
  • inputMap
    options
    作为
    args
    中的键传递:
    { 'inputMap' => inputMap, 'options' => options }
  • 返回统一的响应信封,而非修改
    outMap
  • 保持
    call()
    方法简洁;委托给相同签名的内部方法
    (inputMap, options)
  • 为每个动作及不支持的动作添加测试
请阅读
assets/pattern_migration.cls
—— 开始迁移前查看带注释的迁移示例(VlocityOpenInterface2 → System.Callable)

Best Practices (120-Point Scoring)

最佳实践(120分评分标准)

CategoryPointsKey Rules
Contract & Dispatch20Explicit action list;
switch on
; versioned action strings
Input Validation20Required keys validated; types coerced safely; null guards
Security20
with sharing
; CRUD/FLS checks;
Security.stripInaccessible()
Error Handling15Typed exceptions; consistent error envelope; no empty catch
Bulkification & Limits20No SOQL/DML in loops; supports list inputs
Testing15Positive/negative/contract/bulk tests
Documentation10ApexDoc (
/** ... */
block comments — Salesforce Apex documentation standard) for class and action methods
Thresholds: ✅ 90+ (Ready) | ⚠️ 70-89 (Review) | ❌ <70 (Block)

类别分值核心规则
契约与分发20明确的动作列表;使用
switch on
;带版本的动作字符串
输入验证20必填键校验;安全转换类型;空值防护
安全性20
with sharing
;CRUD/FLS检查;
Security.stripInaccessible()
错误处理15类型化异常;统一错误信封;禁止空catch块
批量处理与限制20循环中禁止SOQL/DML;支持列表输入
测试15正向/反向/契约/批量测试
文档10类及动作方法的ApexDoc(
/** ... */
块注释 —— Salesforce Apex文档标准)
阈值:✅ 90+(就绪) | ⚠️ 70-89(需评审) | ❌ <70(需整改)

⛔ Guardrails (Mandatory)

⛔ 强制约束

Stop and ask the user if any of these would be introduced:
  • Dynamic method execution based on user input (no reflection)
  • SOQL/DML inside loops
  • without sharing
    on callable classes
  • Silent failures (empty catch, swallowed exceptions)
  • Inconsistent response shapes across actions

若将引入以下任何情况,请停止操作并询问用户:
  • 基于用户输入的动态方法执行(禁止反射)
  • 循环内的SOQL/DML操作
  • 可调用类使用
    without sharing
  • 静默失败(空catch块、吞掉异常)
  • 不同动作的响应结构不一致

Gotchas

常见陷阱

IssueResolution
Caller passes flat args but code expects
inputMap
key
Guard defensively: if
args
lacks
'inputMap'
key, treat
args
itself as the input map
call()
receives
null
for
args
Always null-check
args
before accessing keys; initialize to empty map if null
Test class uses
(Map<String, Object>) svc.call(...)
but call returns a wrong type
Ensure every action returns the same envelope type (
Map<String, Object>
) — mixed return types break callers
VlocityOpenInterface2 migration breaks callers that read
outputMap
by reference
After migrating to Callable, callers must read the return value instead of reading
outputMap
— update all callers
IndustriesCallableException
class missing in project
This custom exception must be deployed alongside the callable class — include it in every deployment package
Org has both legacy Open Interface and new Callable wired to same actionOnly one entry point should be active at a time; disable the old interface after confirming the callable works

问题解决方案
调用方传递扁平参数但代码期望
inputMap
防御性处理:若
args
不含
'inputMap'
键,则将
args
本身视为输入映射
call()
args
参数为
null
访问键之前始终做空值检查;若为null则初始化为空映射
测试类使用
(Map<String, Object>) svc.call(...)
但调用返回错误类型
确保每个动作返回相同的信封类型(
Map<String, Object>
)—— 混合返回类型会导致调用方出错
VlocityOpenInterface2迁移破坏了通过引用读取
outputMap
的调用方
迁移至Callable后,调用方必须读取返回值而非
outputMap
—— 更新所有调用方
项目中缺少
IndustriesCallableException
此自定义异常必须与可调用类一起部署 —— 将其包含在每个部署包中
组织中同时存在旧版Open Interface和新版Callable绑定到同一动作同一时间只能激活一个入口点;确认Callable可用后禁用旧接口

Common Anti-Patterns

常见反模式

  • call()
    contains business logic instead of delegating
  • Action names are unversioned or not documented
  • Input maps assumed to have keys without checks
  • Mixed response types (sometimes Map, sometimes String)
  • No tests for unsupported actions

  • call()
    包含业务逻辑而非委托给其他方法
  • 动作名称未带版本或未文档化
  • 假设输入映射包含指定键而未做检查
  • 混合响应类型(有时返回Map,有时返回String)
  • 未针对不支持的动作编写测试

Cross-Skill Integration

跨技能集成

SkillWhen to UseExample
generating-apexGeneral Apex work beyond callable implementations"Create trigger for Account"
generating-custom-object / generating-custom-fieldVerify object/field availability before coding"Describe Product2 fields"
deploying-metadataValidate/deploy callable classes"Deploy to sandbox"

技能使用场景示例
generating-apex可调用实现之外的通用Apex开发"创建Account触发器"
generating-custom-object / generating-custom-field编码前验证对象/字段的可用性"描述Product2字段"
deploying-metadata验证/部署可调用类"部署到沙箱"

Reference Skill

参考技能

Use the core Apex standards, testing patterns, and guardrails in:
  • skills/generating-apex/SKILL.md

使用核心Apex标准、测试模式及约束,请参考:
  • skills/generating-apex/SKILL.md

Bundled Examples

捆绑示例

  • examples/Test_QuoteByProductCallable/ — read-only query example with
    WITH USER_MODE
  • examples/Test_VlocityOpenInterfaceConversion/ — migration from legacy
    VlocityOpenInterface
  • examples/Test_VlocityOpenInterface2Conversion/ — migration from
    VlocityOpenInterface2
  • examples/Test_QuoteByProductCallable/ —— 带
    WITH USER_MODE
    的只读查询示例
  • examples/Test_VlocityOpenInterfaceConversion/ —— 从旧版
    VlocityOpenInterface
    迁移的示例
  • examples/Test_VlocityOpenInterface2Conversion/ —— 从
    VlocityOpenInterface2
    迁移的示例

Output Expectations

输出预期

Deliverables produced by this skill:
  • <ClassName>.cls
    — Callable class implementing
    System.Callable
    with
    switch on action
    dispatch
  • <ClassName>Test.cls
    — Test class with positive, negative, contract, and bulk test methods
  • IndustriesCallableException.cls
    — Custom exception class (if not already present in the project)

本技能生成的交付物:
  • <ClassName>.cls
    —— 实现
    System.Callable
    的可调用类,含
    switch on action
    分发逻辑
  • <ClassName>Test.cls
    —— 包含正向、反向、契约及批量测试方法的测试类
  • IndustriesCallableException.cls
    —— 自定义异常类(若项目中尚未存在)

Notes

注意事项

  • Prefer deterministic, side-effect-aware callable actions
  • Keep action contracts stable; introduce new actions for breaking changes
  • Avoid long-running work in synchronous callables; use async when needed

  • 优先选择可预测、感知副作用的可调用动作
  • 保持动作契约稳定;若需破坏性变更,请新增动作
  • 避免在同步可调用类中执行长时间操作;必要时使用异步方式

Reference File Index

参考文件索引

FileWhen to read
assets/pattern_callable_vanilla.cls
Phase 3 — vanilla
System.Callable
skeleton (flat args, no Open Interface coupling)
assets/pattern_callable_openinterface.cls
Phase 3 —
System.Callable
skeleton with
inputMap
/
options
args (Open Interface-compatible)
assets/pattern_openinterface.cls
Phase 3 —
VlocityOpenInterface2
skeleton with
switch on
dispatch and
outputMap
contract
assets/pattern_test_class.cls
Phase 4 — test class skeleton (positive, negative, contract, bulk, and null-args cases)
assets/pattern_migration.cls
Migration — annotated before/after migration pattern (VlocityOpenInterface2 → System.Callable)
examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls
Phase 3 — complete callable implementation with
WITH USER_MODE
SOQL and error envelope
examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls
Phase 4 — full test class covering positive, contract, and unsupported-action cases
examples/Test_QuoteByProductCallable/IndustriesCallableException.cls
Phase 3 — custom exception pattern for unsupported actions
examples/Test_QuoteByProductCallable/TRANSCRIPT.md
Reference — reasoning transcript for the Quote-by-Product callable example
examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls
Phase 3 — migration pattern from legacy
VlocityOpenInterface
examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls
Phase 4 — test class for VlocityOpenInterface migration example
examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls
Phase 3 — custom exception class deployed alongside VlocityOpenInterface conversion
examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls
Phase 3 — the original legacy VlocityOpenInterface2 class before migration
examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md
Reference — reasoning transcript for VlocityOpenInterface conversion
examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls
Phase 3 — migration pattern from
VlocityOpenInterface2
examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls
Phase 4 — test class for VlocityOpenInterface2 migration example
examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls
Phase 3 — custom exception class deployed alongside VlocityOpenInterface2 conversion
examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls
Phase 3 — remote class used by the VlocityOpenInterface2 migration example
examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md
Reference — reasoning transcript for VlocityOpenInterface2 conversion
文件阅读时机
assets/pattern_callable_vanilla.cls
阶段3 —— 原生
System.Callable
骨架(扁平参数,无Open Interface耦合)
assets/pattern_callable_openinterface.cls
阶段3 —— 带
inputMap
/
options
参数的
System.Callable
骨架(兼容Open Interface)
assets/pattern_openinterface.cls
阶段3 —— 带
switch on
分发与
outputMap
契约的
VlocityOpenInterface2
骨架
assets/pattern_test_class.cls
阶段4 —— 测试类骨架(正向、反向、契约、批量及空参数场景)
assets/pattern_migration.cls
迁移阶段 —— 带注释的迁移模式示例(VlocityOpenInterface2 → System.Callable)
examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls
阶段3 —— 完整的可调用实现,含
WITH USER_MODE
SOQL及错误信封
examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls
阶段4 —— 覆盖正向、契约及不支持动作场景的完整测试类
examples/Test_QuoteByProductCallable/IndustriesCallableException.cls
阶段3 —— 针对不支持动作的自定义异常模式
examples/Test_QuoteByProductCallable/TRANSCRIPT.md
参考 —— 按产品报价可调用示例的推理记录
examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls
阶段3 —— 从旧版
VlocityOpenInterface
迁移的模式
examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls
阶段4 —— VlocityOpenInterface迁移示例的测试类
examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls
阶段3 —— 与VlocityOpenInterface转换一起部署的自定义异常类
examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls
阶段3 —— 迁移前的旧版VlocityOpenInterface2类
examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md
参考 —— VlocityOpenInterface转换的推理记录
examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls
阶段3 —— 从
VlocityOpenInterface2
迁移的模式
examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls
阶段4 —— VlocityOpenInterface2迁移示例的测试类
examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls
阶段3 —— 与VlocityOpenInterface2转换一起部署的自定义异常类
examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls
阶段3 —— VlocityOpenInterface2迁移示例使用的远程类
examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md
参考 —— VlocityOpenInterface2转换的推理记录