はじめに
Apexは、Salesforce上でビジネスロジックを実装できる、Javaに似たプログラミング言語です。
アノテーションについても同様で、これはApex 開発者ガイドにある表現
Apex アノテーションは、メソッドまたはクラスの使用方法を変更するもので、Java のアノテーションと似ています。アノテーションは先頭が @ 記号から始まり、適切なキーワードがそれに続きます。
Apex 開発者ガイドより
から読み取れますが、「なにが?どこが?」って思いますよね。
ということで、
今回はアノテーションについて書いてみます。
アノテーション一覧
- @AuraEnabled
- @Deprecated
- @Future
- @InvocableMethod
- @InvocableVariable
- @isTest
- @JsonAccess
- @NamespaceAccessible
- @ReadOnly
- @RemoteAction
- @SuppressWarnings
- @TestSetup
- @TestVisible
- Apex REST アノテーション:
@AuraEnabled
Lightningコンポーネント(Lightning Web コンポーネントとAura コンポーネントの両方)からの実行を可能にするアノテーションです。
パラメータ「cacheable=true」を使用することで、クライアントにメソッドの実行結果をキャッシュし、パフォーマンスを改善することができます。
メソッドがデータの取得のみを行うものに限りですが、基本的に「@AuraEnabled(cacheable=true)」と書くようにしておき、キャッシュが悪さをするようなら削除する、という使い方がいいのかも。
@Deprecated
メソッド、クラス、例外、列挙、インターフェース、変数、といった各リソースが廃止されたことを示すアノテーションです。
廃止ということで、例えば新規のコードで@Deprecatedのメソッドを利用しようとするとコンパイルでエラーになってたかな。たしか。
Java(Java SE)にも「@Deprecated」という同じ名前のアノテーションがありますが、Javaの場合は非推奨を示すということで、同じように新規のコードで@Deprecatedのメソッドを利用しようとしてもコンパイルでワーニングが出るだけでしたね。
@Future
メソッドを非同期に実行させるアノテーションです。
パラメータ「callout=true」を使用することで、そのメソッドがコールアウトを実行することを許可できます。
処理するデータ量が多いとか、外部のサービスを利用するとか、非同期に処理したいシーンは結構ありますから、よく使ってます。
@InvocableMethod
フローやブロセスビルダーからの実行を可能にするアノテーションです。
パラメータ「label」「description」「category」「configurationEditor」は、全て省略可能ですが、Flow Builderのアクションに表示されるものですので、「label」くらいは必須で使用するというルールの運用がお勧めです。(説明は省略)
@InvocableVariable
@InvocableMethodとセットで使用し、入力パラメータや出力パラメータのメンバ変数に使用できるアノテーションです。
パラメータ「label」「description」「required」は、全て省略可能ですが、Flow Builderのアクションに表示されるものですので、「label」くらいは必須で使用するというルールの運用がお勧めです。(説明は省略)
文字だけでは分かりづらいので、サンプルコードでイメージを伝えます。
見てもらえれば分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
global class MyInvocableAction { // フローやプロセスビルダーから呼び出し可能なメソッド @InvocableMethod(label='combine last and first name') global static List<Output> execute(List<Input> inputList) { List<Output> outputList = new List<Output>(); // ロジック return outputList; } // 入力用クラス global class Input { @InvocableVariable(label='first name' required=true) global String firstName; @InvocableVariable(label='last name' required=true) global String lastName; } // 出力用クラス global class Output { @InvocableVariable global String fullName; @InvocableVariable global Integer employeNumber; } } |
@isTest
テストコードであることを宣言するアノテーションです。
クラスで使用するとテストクラス、メソッドで使用するとテスト対象になります。
Java(JUnit)だと「@Test」というアノテーションがあり、基本的に同じような位置付けになりますが、メソッドのみで使用できるという違いがありますね。
@isTest(SeeAllData=true)
テストする環境(組織)のデータを使用するかどうか指定するパラメータです。
環境(組織)に依存したテストは書かないようにするべきなので、基本的に使わないようにしておくのがいいと思います。
@isTest(OnInstall=true)
管理/未管理パッケージのインストール時に実行するかどうか指定するパラメータです。
このオプションを使わない、もしくはfalseを指定した場合は、インストール時に実行されません。
@isTest(isParallel=true)
テストを並列に実行するかどうか指定するパラメータです。
並列実行できるので、テストを効率的に実行することができます。
並列で実行して不整合が起きないかなど、使いどころに注意して使いましょう。
@JsonAccess
クラスのインスタンスをシリアライズまたはデシリアライズできるかどうか制御するアノテーションです。
パラメータ「serializable」「deserializable」に指定できる値は4つあり、
1) never: 許可しない
2) sameNamespace: 同じ名前空間の Apex コードの場合にのみ許可する
3) samePackage: 同じパッケージの Apex コードの場合にのみ許可する (第二世代パッケージにのみ影響)
4) always: どの Apex コードでも常に許可する
バージョン48.0以前は「serializable=’sameNamespace’ deserializable=’always’」
バージョン49.0以降は「serializable=’sameNamespace’ deserializable=’sameNamespace’」
がデフォルトのアクセス権になっています。
@NamespaceAccessible
第二世代管理パッケージされたクラス、メソッド、インターフェース、プロパティ、および抽象クラスを同じ名前空間から使用できるようにするアノテーションです。
ちなみに、グローバル宣言されているクラスであれば、アノテーション不要で常に全ての名前空間で使用できてます。
@ReadOnly
WebサービスとSchedulableが実装されたクラスで使用できる(メソッドで使用する)、クエリ実行結果の行数制限を緩和してくれるアノテーションです。
そのかわりに、メソッド内でのDML操作や非同期ジョブ操作などは実行することができなくなります。
@RemoteAction
JavaScriptからの実行を可能にするアノテーションです。
JavaScript Remotingって呼ばれてますね。
Visualforceで非同期の処理を実装する時に使う、みたいな覚え方でも間違いじゃないかな。
@SuppressWarnings
このアノテーションは Apex では何も行いませんが、サードパーティツールに情報を提供するために使用できます。
Apex 開発者ガイドより
よく分かりません。
Java(Java SE)にも「@SuppressWarnings」という同じ名前のアノテーションがありますが、引数に指定した警告をコンパイラが出力しないようにする、というものなんですよね。
特に使うことは無いかな。
@TestSetup
テストメソッド実行前に実行するメソッドを指定するアノテーションです。
テストメソッド実行前に実行、つまりテストケースに依存しないテストデータを準備する処理なんかを書くところで使ってます。
Java(JUnit)だと「@BeforeClass」というアノテーションがあり、同じ位置付けになりますね。
@TestVisible
テストクラス以外のクラスでprivateやprotectedのアクセス修飾子が指定されたメソッド、メンバ変数、内部クラスを、テストクラスに公開するアノテーションです。
内部的な処理は大体privateで書きますから、あまり多くは無いですが、時々とても助けられることがあります。
これは知っておくべきですよ。
@Apex REST アノテーション
@RestResource(urlMapping=’/yourUrl’)
クラスをRESTのリソースとして公開するアノテーションです。
Java(JAX-RS)だと「@Path」というアノテーションがあり、同じ位置付けになりますね。
@HttpDelete
HTTP DELETEメソッドに対応するメソッド(削除)を指定するアノテーションです。
Java(JAX-RS)だと「@DELETE」というアノテーションがあり、同じ位置付けになりますね。
@HttpGet
HTTP GETメソッドに対応するメソッド(参照)を指定するアノテーションです。
Java(JAX-RS)だと「@GET」というアノテーションがあり、同じ位置付けになりますね。
@HttpPost
HTTP POSTメソッドに対応するメソッド(作成)を指定するアノテーションです。
Java(JAX-RS)だと「@POST」というアノテーションがあり、同じ位置付けになりますね。
@HttpPut
HTTP PUTメソッドに対応するメソッド(更新)を指定するアノテーションです。
Java(JAX-RS)だと「@PUT」というアノテーションがあり、同じ位置付けになりますね。
おわりに
内容としては、既に多くの方がまとめられてますし、Salesforceが公開しているApex 開発者ガイドを見ればいいというものだったりする訳ですが、今回あらためて自分の言葉でまとめてみました。
自社のSalesforceエンジニアはもちろん、これを見たSalesforceエンジニアの一助になればいいかな、と思ってます。
※まとめている内容は概要レベルですから、使用する際はガイドを見て使用条件を確認して下さい。
結構いろいろ条件があります。