SalesforceのLightning Process BuilderはGUIでワークフローを構成することができる機能ですが、Apexコードを呼び出せるのが一つの特徴となっています。そこで、今回はApexコード呼び出し(InvokableMethod)を試してみました。
Apexコードの作成
任意のメソッドに対してInvokableMethodアノテーションを付与すればOKです。具体的には以下のような感じです。
public with sharing class ProcessAction {
@InvocableMethod(label='hoge' description='fuga')
public static List<String> doAction(List<String> str) {
System.debug(str);
return new List<String>();
}
}
labelは処理の名前、descriptionには処理の概要を記載します。ただし、入力内容はProcess Builder上には表示されず、Flow Designerでのフロー作成時のみ表示される仕様となっています。
InvocableMethodアノテーションが付与されているメソッドがアクションの対象になりますが、1クラスあたり1メソッドしか定義できない仕様なので、アクション毎にクラスを作成する必要があります。
引数は必ずリスト型にする必要があります。これはProcess Builderがバルク処理を行うためで、100件のDMLに対するプロセスであれば100件分のデータがリスト型で引数として入ってきます。リストのデータ型にはプリミティブ、プリミティブのリスト(List>)、Salesforceオブジェクト、Salesforceオブジェクト型のリスト、ユーザ定義型(InvocableVariable アノテーションのメンバー変数入り)を利用することが出来ます。戻り値は上記に加えてvoidが許可されます。また、引数は一つだけしか設定できません。
※List
>を引数にできますがイマイチ利点が不明です。
上記例だと、文字列の引数を一つだけしか取れませんが、複数の引数を取りたい場合はユーザ定義型を引数にする必要があります。サンプルは以下の通り。
public class Parameter {
@InvocableVariable
public ID accountId;
@InvocableVariable
public String accountName;
@InvocableVariable
public Integer accountNumber;
@InvocableVariable
public Account acc;
@InvocableVariable
public Boolean bool;
}
メンバー変数として許可される型はユーザ定義型を除き、InvokableMethodの引数と同じです。メンバー変数はpublicで定義してください。
Apexコードを以下のように書き換えると、複数の引数を取ることができます。
public with sharing class ProcessAction {
@InvocableMethod(label='hoge' description='fuga')
public static void doAction(List<Parameter> params) {
System.debug(params);
for (Parameter param : params) {
System.debug(param);
}
return;
}
}
Flow Designerでの利用
InvokableMethodで実装したApexコードはFlow Designerでも利用することが出来ます。Process.Pluginによる実装ではFlow Designerでしか利用することが出来ないので、InvokableMethodで実装する方が良さそうです。
上記サンプルをFlow Designerで表示すると以下のようになります。