Apex アノテーションをまとめて攻略

今回のテーマはApexアノテーション。
意外と実用的なものが揃っているので、単にテスト対策だけでなく、使い方も覚えておきましょう。
今回はまとめを作らないので、テスト対策の方は赤字部分を抑えれば多分OKです。

スポンサーリンク

アノテーションはそれほど多くない

現バージョン(Winter19)で使用できるアノテーションは全部で16。
意外と多くないので、この際その16個をまとめて攻略しちゃいます。
一応僕の独断と偏見で重要度もつけました。★が多い方が、よく使う・実用的なものだと思ってください。

アノテーション解説

@AuraEnabled

重要度:★★★
対象:staticメソッド
制約事項:globalかpublicにする

これは最近出てきた新参者です。
Lightningコンポーネントとセットで使用され、Lightningコンポーネント(クライアント側コントローラ、ヘルパー)から
サーバ側のメソッドを呼び出すときに、Apexクラスのメソッドに対して使用されます

リモートコントローラーとして動くことになるので、メソッドはstaticにする必要があります。

@Deprecated

重要度:★
対象:メソッド
制約事項:非管理パッケージには使用できない

これはマイナーなやつです。
メソッドにつけることができて、これをつけたメソッドは外部から見たときに非推奨になります。
将来的に使えなくなるよっていう宣言をすることになるため、今後変更の可能性がある非管理パッケージに対しては使用することができません。

@Future

重要度:★★★
対象:staticメソッド
制約事項:戻り値は必ずvoidになる

これは説明するまでもないでしょう。
これをつけたメソッドは非同期として実行されます
呼び出した瞬間、別プロセスとして走るので、呼び出し側は戻り値を受け取っている暇がありません。
よって、これを使う時はメソッドはstaticで必ずvoidになります。
また、@Future内でコールアウトを実施する場合は、(callout=true)をつける必要があります(使い方はここを参照)。

@InvocableMethod

重要度:★★
対象:staticメソッド
制約事項:globalかpublicにする

これをつけると、フローやプロセスビルダーから呼ぶことが可能になります。
フローやプロセスビルダーから呼ばれるため、メソッドはglobalかpublicにする必要があります。

@InvocableVariable

重要度:★★
対象:メンバ変数
制約事項:globalかpublicにする

これはInvocableMethodとセットで使用されます。
InvocableMethodで指定したメソッドで引数を指定することができますが、InvocableMethod単独では単純はプリミティブ型しか使用できないため、クラスのプロパティとして入力(引数)と出力(戻り値)を使用する場合に、各メンバ変数に対していちいちつける必要があります。入力で必須項目がある場合は、(required=true)をつけることで制約をかけることができます。

以下、InvocableMethodとInvocableVariableを使ったコード例です。

InvocableHogeAction.cls

global class InvocableHogeAction {

    // フローやプロセスビルダーから呼び出し可能なメソッド
    @InvocableMethod(label='Convert Leads')
    global static List<HogeOutput> convertLeads(List<HogeInput> hiList) {
        List<HogeOutput> results = new List<HogeOutput>();
        Integer i = 0;
        for (HogeInput hi : hiList) {
             i++;
            HogeOutput ho = new HogeOutput();
            String middleName = String.isNotBlank(hi.middleName) ? ' ' + hi.middleName + ' ': ' ';
            ho.fullName = hi.firstName + middleName + hi.lastName;
            ho.index = i;
            results.add(ho);
        }
        return results;
    }

    // 入力用クラス
    global class HogeInput {
        // 必須項目には(required=true)をつける
        @InvocableVariable(required=true)
        global String firstName;

        // 必須項目には(required=true)をつける
        @InvocableVariable(required=true)
        global String lastName;

        @InvocableVariable
        global String middleName;
    }
  
     // 出力用クラス
    global class HogeOutput {
        @InvocableVariable
        global String fullName;

        @InvocableVariable
        global Integer index;
    }
}

@IsTest

重要度:★★★
対象:クラスorメソッド
制約事項:globalかpublicにする

これもお馴染みかと思います。
テストコードを宣言するアノテーション。クラスとメソッドにつけることができ、クラスにつけた場合は組織のコードにカウントされず、メソッドにつけた場合は、TesRunでテストを走らせることができます。
また、オブションもいくつかあるので、込みで覚えておきましょう。

@IsTest(SeeAllData=true)

組織のデータを使用するか否かのオブション。SeeAllData=trueで組織に登録されているデータを使用することができます。
データの登録状況でエラー結果が変わったり、本番環境で大量データを扱うときに時間がかかったりするので取り扱いには注意しましょう。

@IsTest(OnInstall=true)

パッケージのインストール時に実行されるオプションです。
パッケージインストール時にこのテストが失敗するとインストールができません。

@IsTest(isParallel=true)

最近出てきたオプション。
テストクラスを並列実行することができ、なおかつテスト同時実行にカウントされないという優れモノ。

@ReadOnly

重要度:★★
対象:メソッド
制約事項:レコード操作や非同期実行などができない

クエリからの結果の行数制限をなくすことができます。
一方、Readonlyだけあって、このメソッド内で取得したレコードはUpdateしたり、非同期メソッドを呼び出すことができません

@RemoteAction

重要度:★★★
対象:staticメソッド
制約事項:globalかpublicにする

JavaScriptからメソッドを呼び出すことが可能です。
非同期で実行されますが、APIコール数を消費します。

@SuppressWarnings

重要度:★
対象:クラスorメソッド
制約事項:特になし

これはかなりマイナーなやつ。
サードパーティーツールに情報を提供します。
何かメソッドの動きが変わるとかではないです。

Javaの名残なんでしょうが、使う機会あるのか。。。

@TestSetup

重要度:★★★
対象:メソッド
制約事項:テストクラス内に記載する

テストメソッド実行前に実行されるメソッドです。
テストケースによらないデータの投入などをこのメソッドで行うといちいち書かなくて済むので便利です。

@TestVisible

重要度:★★
対象:メソッド
制約事項:privateまたはprotectedメソッドに対して使用できる

これをメソッドにつけると、privateメソッドであってもテストメソッドに限り外部クラスから呼び出すことが可能です。
カバレージを徹底的に潰したい人向け。

@RestResource(urlMapping=’/yourUrl’)

重要度:★★
対象:クラス
制約事項:HTTPメソッドによって、以下アノテーションを使用したメソッドを定義する

自分でREST APIを作成するときに使うアノテーション。
HTTPメソッドによって、下記アノテーションのメソッドを用意する必要があります。

  • @HttpDelete
  • @HttpGet
  • @HttpPost
  • @HttpPut

ここでもちょっと書いていますが、urlMappingで指定されたものがAPI URLとなり、
urlMappingはhttps://instance.salesforce.com/services/apexrest以降を指定します。

コメント