Apex で定義されたデータ型
Apex で定義されたデータ型を使用すると、Web サービスへのコールから通常返される複雑なデータオブジェクトをフローで操作できるようになります。フロー内に Apex で定義された変数を作成し、Web コールから返された JSON を直接処理します。
必要なエディション
| サポートされているエディションを表示する。 |
開発者は、Web からフローへの自動変換のパターンとして機能するように Apex クラスを定義できます。これにより、追加コードなしで宣言型アプローチを使用して、フローで実行される結果のオブジェクトを完全に操作できます。Apex で定義されたリソースは、Mulesoft および REST コールを介してアクセスされるリッチな外部 Web オブジェクトにフローを接続する場合に役立ちます。データ型がサポートされていない場合、フローはその値を Lightning コンポーネントに渡すことができ、Apex を使用してそれを操作できます。
Apex で定義されたデータ型によるフローの拡張
通常、Web サービスをコールすると、複雑なデータオブジェクトが返されますが、Apex、フロー、および Lightning コンポーネントを併用すると、そうしたオブジェクトを含むビジネスプロセスを自動化できます。たとえば、Web 製品に関する外部の製品データを取得してから、Salesforce でレコードを作成できます。
REST エンドポイントをコールすると、製品データを含む JSON 応答が返されます。
{
"model": "Vintage Cruiser Jacket",
"brand": "Acme",
"identifiers": [
{
"SKU": "A-J001"
},
{
"SKU": "A-J002"
},
{
"SKU": "A-J003"
}
],
"price": {
"amount": {
"currencyValue": "500.00",
"name": "Amount",
"currency": "USD"
},
"salesUnit": {
"code": "EA",
"name": "Each"
}
}
}
関連項目:
Apex クラスによるモデル JSON オブジェクト
Apex クラスで複雑なデータオブジェクトを定義します。たとえば、JSON オブジェクトに対応した Apex クラスを作成できます。このクラスは、テンプレートとして機能し、JSON をフローで使用できるオブジェクトに変換します。
Web 製品の Apex クラスを定義すると、REST コールを使用して Web サービスからデータを取得する Apex アクションを作成できます。Apex で定義されたデータ型を使用するフロー変数に、返されたデータを保存します。その後、フロー、Apex、および Lightning コンポーネントのデータを操作します。
WebProduct Apex テンプレートの例を次に示します。これには、主WebProductクラスと、Price およびIdentifiers 用のクラスが含まれます。WebProduct には 3 つのデータタイプがあります。
- model 項目と brand 項目は、プリミティブ String データ型を使用します。
- price 項目は、
Priceクラスを参照します。フロー用の Apex で定義されたデータ型では、内部クラスがサポートされません。このため、各クラスが別々のクラスファイルに保存されていることを確認してください。 - identifiers 項目は、price に類似していますが、リストとして表現されます。
Identifiersクラスでは、フローが JSON 配列にアクセスして 3 つの特定の SKU 番号のリストを表現できます。 parseメソッドは、JSON をフローがアクセスできる Apex オブジェクトに変換します。- フロー用の Apex クラスの項目には、
@AuraEnabledアノテーションが必要です。
public class WebProduct {
@AuraEnabled
public String model;
@AuraEnabled
public String brand;
//Because the identifiers information is an array in the JSON schema, we create a separate class called Identifiers and define a property that contains a List.
@AuraEnabled
public List<Identifiers> identifiers;
//This field has an Apex-defined data type in the Price Apex class.
@AuraEnabled
public Price price;
//This method is used as part of the Create Apex Action section.
public static WebProduct parse(String json) {
return (WebProduct) System.JSON.deserialize(json, WebProduct.class);
}
Identifiers Apex クラスは、SKU 項目を定義します。
public class Identifiers {
@AuraEnabled
public String SKU;
}
Price Apex クラスは、amount 項目と salesUnit 項目を定義します。
public class Price {
//This field has an Apex-defined data type in the Amount Apex class.
@AuraEnabled
public Amount amount;
//This field has an Apex-defined data type in the SalesUnit Apex class.
@AuraEnabled
public SalesUnit salesUnit;
}
Amount Apex クラスは、currencyValue 項目、name 項目、および currency 項目を定義します。
public class Amount {
@AuraEnabled
public String currencyValue;
@AuraEnabled
public String name;
@AuraEnabled
public String currency;
}
SalesUnit Apex クラスは、code 項目と name 項目を定義します。
public class SalesUnit {
@AuraEnabled
public String code;
@AuraEnabled
public String name;
}
Apex アクションの作成
JSON データをフローリソースに変換するメカニズムを作成すると、JSON データを取得する Apex クラスを作成できます。@InvocableMethod アノテーションを使用して、クラスをフローの Apex アクションとして定義できます。
GetWebProduct Apex クラスには、Apex アクションが定義されています。このアクションにより、REST エンドポイントから製品データが取得され、JSON 応答が解析されて WebProduct Apex オブジェクトが作成されます。
API バージョン 66.0 以降、呼び出し可能なアクション パラメータとして使用されるカスタム Apex クラスには、アクセス可能な引数なしコンストラクタが必要です。この例では、Requests および Results 内部クラスでコンストラクタが定義されていないため、Apex は暗黙的に引数なしのコンストラクタを提供します。これらのクラスに他のコンストラクターを追加する場合、クラスには適切なアクセス修飾子 (public または global) が含まれる明示的な引数なしコンストラクターが必要です。
開発者は、InvocableActionExtension メタデータ・ファイルを作成して、Flow Builder でのこの Apex アクションの表示方法をカスタマイズできます。このメタデータにより、入力順序とグルーピングの制御、カスタムヘッダーの追加、入力パラメーターの選択リストの定義、特定の入力のカスタムプロパティエディターの作成を行うことができます。詳細は、『メタデータ API 開発者ガイド』の「InvocableActionExtension」を参照してください。
global with sharing class GetWebProduct {
@InvocableMethod
public static List<Results> GetWebProduct(List<Requests> requests)
{
Http http = new Http();
HttpRequest request = new HttpRequest();
String endpoint = requests[0].endpoint;
String submittedId = requests[0].submittedId;
request.setEndpoint(endpoint + submittedId );
request.setMethod('GET');
HttpResponse response = http.send(request);
Results curResult = new Results();
String responseJSON = response.getBody();
WebProduct curProduct = WebProduct.parse(responseJSON);
curResult.WebProduct = curProduct;
List<Results> resultsList = new List<Results>();
resultsList.add(curResult);
return resultsList;
}
global class Requests {
@InvocableVariable
global String submittedId;
@InvocableVariable
global String endpoint;
}
global class Results {
@InvocableVariable
global WebProduct WebProduct;
}
}
この例では、グローバルアクセス修飾子を使用します。これは、グローバルアクセス修飾子が管理パッケージシナリオ用に設計されているためです。組織内でのみ使用する Apex アクションを作成する場合は、global ではなく public を使用できます。
Apex アクションの設定
Apex アクションを画面フローに追加し、その入力を設定します。
[Get Web Product (Web 製品の取得)] Apex アクションでは、{!Get_Web_Product} に Web 製品データが自動的に保存されます。
フロー、Apex、および Lightning コンポーネントのデータを操作できるようになりました。たとえば、ID をループし、製品のコレクションをアセンブルして、製品データを生成するフローを作成します。レコードのコレクションを Salesforce に保存し、フロー画面コンポーネントにデータを表示します。
Apex で定義されたアクションへのカスタムアイコンの追加
Apex で定義された呼び出し可能なアクションにカスタムアイコンを追加して、Flow Builder キャンバスで見つけやすくします。
カスタムアイコンとしては、SVG ファイルまたは既存の Salesforce Lightning Design System (SLDS) アイコンを使用できます。
SVG ファイルは、次の要件を満たす必要があります。
- ファイル内の
<svg>要素にid、xmlns、およびviewBox属性が含まれている。 - ファイル内の
<svg>要素にstyle、height、およびwidth属性が含まれていない。 - ファイルに
<clipPath>要素が含まれていない。 - ファイル内の各
<path>要素にfill属性が含まれている。
たとえば、次の SVG ファイルはカスタムアイコンとしてサポートされます。
<svg id="top" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path fill="#673ab7" d="M12,44c-1.657,0-3-1.343-3-3V7c0-1.657,1.343-3,3-3h16l11,11v26c0,1.657-1.343,3-3,3H12z"/><path fill="#5e35b1" d="M39 15L28.883 14.125 39 24.124z"/><path fill="#b39ddb" d="M39,15h-8c-1.657,0-3-1.343-3-3V4L39,15z"/><path fill="#f5f5f5" d="M22 23H32V25H22zM22 28H32V30H22zM22 33H32V35H22zM17.5 22.5A1.5 1.5 0 1 0 17.5 25.5 1.5 1.5 0 1 0 17.5 22.5zM17.5 27.5A1.5 1.5 0 1 0 17.5 30.5 1.5 1.5 0 1 0 17.5 27.5zM17.5 32.5A1.5 1.5 0 1 0 17.5 35.5 1.5 1.5 0 1 0 17.5 32.5z"/></svg>Apex で定義された呼び出し可能なアクションのカスタムアイコンとしてサポートされているのは、標準オブジェクトアイコンとカスタムオブジェクト SLDS アイコンのみです。
- SVG ファイルを使用する場合は、ファイルを組織の静的リソースとしてアップロードします。
- 呼び出し可能なアクションの
InvocableMethodアノテーションのiconName属性をアイコンの名前に設定します。
SVG アイコンの場合、名前を resource:namespace__iconName:svgID として指定します。次に例を示します。
public class CustomSvgIcon {
@InvocableMethod(iconName='resource:google:top')
public static void run() {}
}public class CustomSvgIcon {
@InvocableMethod(label='myIcon' iconName='resource:myPackageNamespace__google:top')
global static List<Integer> myMethod(List<Integer> request) {
List<Integer> results = new List<Integer>();
results.add(1);
return results;
}-
iconName は、アイコンをアップロードしたときに指定した名前です。
-
svgID は、SVG ファイルの <svg> 要素の
id属性の値です。 -
namespace は、カスタマイズする呼び出し可能なアクションが含まれるパッケージの名前空間です。呼び出し可能なアクションが管理パッケージに含まれている場合、namespace_ は必須のプレフィックスです。それ以外の場合は、省略可能です。管理パッケージに含まれている呼び出し可能なアクションにカスタムアイコンを使用するには、呼び出し可能なアクションを定義するメソッドを
globalとして宣言します。
SLDS アイコンの場合、名前を slds:category:name として指定します。次に例を示します。
public class CustomSldsIcon {
@InvocableMethod(iconName='slds:standard:choice')
public static void run() {}
}- category はアイコンのカテゴリ名です。
- name は SLDS のファイル名です。
ユーザーが Flow Builder で呼び出し可能なアクションを追加すると、それを表すカスタムアイコンが Flow Builder キャンバスに表示されます。
