例外処理とエラー時ロールバックを処理する
学習の目的
この単元を完了すると、次のことができるようになります。
- ステップが失敗した場合に Try Catch Block を使用してエラーを特定する方法を説明する。
- Rollback On Error を使用する場合について説明する。
- カスタム権限を使用して特定のチームにデータアクセス権を付与する方法を説明する。
はじめに
ここまでに Robert は、ClearLight が求めていた新しいメンバーポータル機能を追加し、営業チームが大規模トランザクションを処理できるようにソリューションを補強しました。
すべての処理時間の長い Integration Procedure が円滑に実行されるように更新もしました。
ClearLight プロジェクトの最終フェーズは、営業チーム向けに新しいカスタマー取引先と商談をモバイルデバイスから作成できるアプリケーションを作成することです。例外処理とエラー時のロールバック (Rollback On Error) という、2 つの重要な要件があります。このタスクを誰が担当するのでしょうか? もちろん、スーパー開発者の Robert です。
Robert はローコード API ビルダーで REST API を作成し、Salesforce でホストするつもりです。
他にも次のことを実現する必要があります。
- 商談の作成が失敗したら、トランザクションは取引先レコードの作成をロールバックする。
- エラーが発生したら、REST API は会社で定義されたエラーコードとメッセージを返す。
- 営業チームの特定のグループのみが REST API にアクセスできる。
Robert は、この要件を満たすには Integration Procedure と Data Mapper Load をどう構成すればよいか調べています。
Rollback on Error (エラー時ロールバック) 構成
Data Mapper Load は JSON、XML、またはカスタムインプットフォーマットのデータを受け入れ、データを Salesforce オブジェクトに出力します。Data Mapper Load は呼び出されると、マッピングと数式をインプットデータに適用してアウトプットデータを作成します。そのアウトプットデータをマッピングに従って Salesforce オブジェクトに読み込みます。
Robert の最初のユースケースでは、商談の作成が失敗したら、トランザクションが取引先レコードの作成をロールバックする必要があります。この機能を作成するには、次のことをする必要があります。
- 親-子リレーションの保存をサポートする Data Mapper Load を作成する。
- AccountOpportunityCreation Data Mapper Load を構成する。
- Rollback On Error オプションを実装する。
Rollback On Error を構成する手順は、次のとおりです。
1.Data Mapper Load で [Objects (オブジェクト)] タブ (1) を選択します。
2.更新する Salesforce オブジェクトを指定します。この場合、Account (取引先) レコード (2) と Opportunity (商談) レコード (3) を作成する必要があります。
3.[Options (オプション)] タブ (1) を選択し、設定を検討します。
- Ignore Errors (エラーを無視) (2): ステップでエラーが発生しても Data Mapper は実行を継続します。たとえば、Account ステップの取引先レコードの作成でエラーが発生しても、Data Mapper プロセスは次のステップに進み、商談レコードを作成します。
- Rollback On Error (エラー時ロールバック) (3): エラーが発生したら、Data Mapper はすべての更新をロールバックします。
- Use Assignment Rules (割り当てルールを使用) (4): ケースが割り当てられたら、構成されたルールに基づいて Data Mapper がユーザーにメール通知を送信します。
- Overwrite Target For All Null Inputs (すべての null インプットに対して対象を上書き) (5): デフォルトで、値が null の場合、Data Mapper はアウトプット JSON にその項目のノードを作成しません。
4.[Rollback On Error (エラー時ロールバック)] を選択します。
どうなるかプレビューしましょう。
- [Preview (プレビュー)] (1) タブに移動して Data Mapper Load を実行します。[Objects Created (作成されたオブジェクト)] (2) セクションに商談レコードが表示されていません。
- [Errors (エラー)] (3) セクションを展開してエラーメッセージをチェックします。この例のエラーは、完了予定日がないことを示しています。
エラーは商談の保存時に発生したため、トランザクションは取引先レコードをロールバックしました。
Try Catch Block 構成
Robert は快調に Rollback On Error を設定し、次の要件に進んでいます。エラーが発生したら、API はクライアントが定義したエラーコードとメッセージを返す必要があります。Try Catch Block では、ブロック内でステップの実行を「try」し、ステップが失敗したらエラーを「catch」します。Robert は試してみることにしました。
Try Catch Block にエラーコードとメッセージを設定する方法を見ていきましょう。
Try Catch Block を構成する手順は、次のとおりです。
- [Try Catch Block] (1) を [Structure (構造)] パネルにドラッグします。
- [Failure Response (失敗時レスポンス)] (2) に、Try Catch Block が失敗した場合にレスポンスで返す値を指定します。
-
[Add Key/Value Pair (値/キーペアを追加)] をクリックします。
- キーを「ErrorCode」(エラーコード)、値を「001」に設定します。
- もう 1 つキー/値ペアを追加してエラーメッセージを指定します。キーを「Message」、値を「Error rollback all transactions (エラー時にすべてのトランザクションをロールバック)」に設定します。
- もう 1 つキー/値ペアを追加し、キーを「Detail」、値を「%CreateAccountAndOpportunity:errors%」に設定します。
- [Custom Failure Response (カスタム失敗時レスポンス)] セクションで、[Fail On Block Error (ブロックエラー時に失敗)] (3) が選択されていることを確認します。
どうなるかを確認してみましょう。
8.[Preview (プレビュー)] (1) タブに移動し、ErrorCode、Message、Detail が [Response (レスポンス)] (2) セクションで返されていることを確認します。
Rollback on Error の有効化
トランザクション境界内部で発生する操作は、操作の 1 つの単位に相当します。トランザクション内のすべての操作がエラーなしで実行を完了した後にのみ、すべての変更がデータベースにコミットされます。Rollback On Error オプションが有効な中間ステップのいずれかでエラーが発生した場合、すべてのデータベース変更はロールバックされ、トランザクションはコミットされません。
簡単に言うと、OmniScript から sObject のデータの変更、更新、作成が要求されたら、要求全体が正常に完了した場合にのみ、すべての変更はデータベースにコミットされます。
[Rollback On Error (エラー時ロールバック)] オプションに再び目を向けましょう。
[Structure (構造)] パネルの [Procedure Configuration (プロシージャー構成)] (1) で、[Rollback On Error (エラー時ロールバック)] (2) を有効にします。
この例では、2 つのトランザクションを含む Integration Procedure が表示されています。最初のトランザクション (1) では取引先の作成と更新、2 つ目のトランザクション (2) では商談の作成と更新を行います。両方のトランザクションが作成されて更新されると、Integration Procedure の実行は成功になります。一方のトランザクションのみが失敗した場合、作成されたもう一方のトランザクションでもロールバックを行います。
ここでは Try Catch Block Account Creation は正常に作成されて更新されます。Try Catch Block Opportunity Creation でエラーが発生した場合、トランザクションは Account Creation をロールバックします。
Integration Procedure REST API
Data Mapper の作成と Integration Procedure の有効化によって HTTP メソッド (GET、POST など) をサポートする REST API エンドポイントが作成されます。
Workbench に入力するエンドポイント URL は次のようになります。
- Data Mapper の REST API は、このエンドポイントを使って使用できます:
/services/apexrest/{namespace}/v2/DataMapper/{DataMapperName}/
- 例: AccountOpportunityLoad という名前の Data Mapper のエンドポイント URL:
/services/apexrest/vlocity_ins/v2/Data/AccountOpportunityLoad/
- Type (タイプ) = sample で SubType (サブタイプ) = CreateOpportunity の Integration Procedure のエンドポイント URL:
/services/apexrest/vlocity_ins/v1/integrationprocedure/sample_CreateOpportunity/
- Integration Procedure のエンドポイント:
/services/apexrest/{namespace}/v1/integrationprocedure/{Type}_{SubType}/
Workbench (1) で Integration Procedure を実行しましょう。Workbench を開き、REST Explorer (2) を選択します。[Select (選択)] (3) をクリックして続行します。
REST API で実行する HTTP メソッド (1) を選択します。インプット項目 (2) にエンドポイント URL を入力し、[Execute (実行)] (3) をクリックしてレスポンスを表示します。
[Request Body (リクエストボディ)] (1) セクションにインプットを入力すると、[Raw Response (未加工レスポンス)] (2) セクションに結果が表示されます。
カスタム権限構成
Robert はついに最後のプロジェクト要件に取りかかります。REST API を特定のグループのみからアクセス可能にする必要があります。この例では、AccountOpportunityLoad Data Mapper と OpportunityCreation Integration Procedure へのアクセスを限定するカスタム権限について見ていきます。
営業チームには CreateOpportunity Integration Procedure REST API へのアクセス権のみ、内部システム管理者チームには AccountOpportunityLoad DataMapperLoad REST API へのアクセス権のみを付与する必要があります。
カスタム権限を使用して特定のチームにレコードアクセス権を付与する方法を学習しましょう。
- [Setup (設定)] | [Custom Permissions (カスタム権限)] (1) に移動します。
- InternalAdmin (内部システム管理者) (2) と SalesTeam (営業チーム) (3) の新規カスタム権限を作成します。
- カスタム権限を Data Mapper に割り当てます。
- 新規 Data Mapper (1) を作成します。
- [Required Permission (必須権限)] (2) 項目に「InternalAdmin」と入力します。
次は、SalesTeam の [Custom Permission (カスタム権限)] を構成します。CreateOpportunity Integration Procedure への権限を割り当てます。
- 新規 Integration Procedure (1) を作成します。
- [Required Permission (必須権限)] (2) 項目に「SalesTeam」と入力します。
Robert はエラーと例外の処理のエキスパートになりました。プロジェクトの要件をすべて実現したことでかなり自信がつきました。今日はここで切り上げてリフレッシュしましょう!
リソース