课程章节介绍
好,同学们,今天我们来讲一下 Apex 里的 Process.Plugin 接口,它是用来让我们在流程里调用自定义的 Apex 代码的。你写一个插件类,实现这个接口,就能在 Process Builder 或者 Flow 里使用它了。
首先,这个插件怎么告诉流程:我有哪些输入、哪些输出呢?答案就是用 InputTerm 和 OutputTerm 这两个内部类。你在插件类里必须定义一个 `describe` 方法,返回一个描述对象,里面就有这两个列表。
在 InputTerm 里,你会告诉流程:这个参数叫什么名字,是不是必填的,它是什么类型。构造函数需要三个东西:名字(字符串),一个可选的描述(也是字符串),还有一个 MechanterType 枚举,以及一个布尔值,用来标这个参数是不是必填的。必填的那个布尔值不可以省略,一定要写。而 OutputTerm 就简单一点,只需要名字、可选的描述和 MechanterType 枚举,没有必填这个字段,因为输出肯定是插件返回的。
那 MechanterType 能支持哪些类型呢?从布尔值到字符串,一共覆盖了 11 种基础的原始类型。比如 BOOLEAN, NUMBER, CURRENCY, DATE, DATETIME, PERCENT, TEXT, EMAIL 等等,一直到 WRING 都在内。但是它不支持复杂类型,像 Blob、集合(List、Map 这些)还有 sObject 都是不行的,这是插件的限制。
在数据层面,还有自动转换的规则,这点要留意。比如,如果你在流程里输入一个数字,但插件的 InputTerm 声明为 DECIMAL,系统会自动转换;日期和日期时间之间也能互相转换,只是时间部分可能被截掉;布尔值可以自动转成布尔,也可以被当作 1 或 0 的数字来用;文本类数据会自动映射成 Apex 里的字符串。这些转换都是平台帮你做的,不需要你写额外代码。
接下来讲讲怎么写测试类。因为插件的 invoke 方法是实打实要被流程调用的,所以测试的时候,你需要模拟这个调用过程。你可以这样写:先实例化你的插件类,然后用 Map 搭一个 inputParams,里面放的 key 就是 InputTerm 的名字,value 就是你要传的测试值。然后构造一个 Process.PluginRequest,把 inputParams 和插件描述传进去。最后调用 invoke 方法,拿到 Process.PluginResult,并断言 result.outputValues 里对应的输出参数名和数值是不是你期望的。这样就能保证你的插件逻辑是对的。
不过要注意,在你写插件逻辑的时候,有些操作用不了。因为插件是在流程的上下文中执行,它不支持查询数据库(SOQL)、发送外发消息(比如 Email)、做全局描述报告,也不允许在插件内部触发别的流程或再次调用嵌套的插件。这些限制是为了保证流程执行的安全性和可控性,所以你的插件里要避开这些操作。
好了,记住:定义输入输出用 InputTerm 和 OutputTerm,注意类型转换规则,测试时手动构造 request,以及避开那些不支持的调用,你就能顺利写出安全的流程插件了。今天就到这里,下次我们再深入练习。
关键词
Apex
Salesforce
Developer Guide