omnistudio-callable-apex-generate

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

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

omnistudio-callable-apex-generate:面向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可调用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
    platform-apex-generate
    ); building Integration Procedures (use
    omnistudio-integration-procedure-generate
    ); authoring OmniScripts (use
    omnistudio-omniscript-generate
    ); deploying Apex classes (use
    platform-metadata-deploy
    )

  • 包含范围:为Industries扩展点创建
    System.Callable
    类;评审可调用实现的正确性与风险;将
    VlocityOpenInterface
    /
    VlocityOpenInterface2
    迁移至
    System.Callable
    ;120分评分与验证
  • 排除范围:无调用接口的通用Apex类(请使用
    platform-apex-generate
    );构建Integration Procedures(请使用
    omnistudio-integration-procedure-generate
    );编写OmniScripts(请使用
    omnistudio-omniscript-generate
    );部署Apex类(请使用
    platform-metadata-deploy

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、Integration Procedure、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的场景。
Callable骨架(与VlocityOpenInterface输入一致):
生成前请阅读
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
    参数);仅入口点不同
  • 为保持一致性,使用相同的信封结构(
    success
    data
    errors
    )填充
    outputMap
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
platform-apex-generateGeneral Apex work beyond callable implementations"Create trigger for Account"
platform-custom-object-generate / platform-custom-field-generateVerify object/field availability before coding"Describe Product2 fields"
platform-metadata-deployValidate/deploy callable classes"Deploy to sandbox"

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

Reference Skill

参考技能

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

使用以下核心Apex标准、测试模式和防护规则:
  • skills/platform-apex-generate/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转换的推理记录