NamespaceAccessible アノテーション
@namespaceAccessible は、パッケージ内の公開 Apex を、同じ名前空間を使用する他のパッケージで使用できるようにします。このアノテーションがないと、2GP パッケージで定義されている Apex クラス、メソッド、インターフェース、プロパティ、および抽象クラスは、名前空間を共有する他のパッケージからアクセスできません。グローバルとして宣言されている Apex は、アノテーションを必要とせず、常にすべての名前空間で使用できます。
2GP 管理パッケージについての詳細は、『Salesforce DX 開発者ガイド』の「第二世代管理パッケージ」を参照してください。
パッケージ間の Apex のアクセシビリティの考慮事項
- Lightning コンポーネントから参照される @AuraEnabled Apex メソッドで @namespaceAccessible アノテーションは使用できません。
- @namespaceAccessible アノテーションはいつでも追加または削除できます。管理およびリリース済み Apex コードに対しても可能です。アノテーションを追加または削除する前に、その機能に依存する連動パッケージがないことを確認してください。
- パッケージの @namespaceAccessible Apex を追加または削除するときには、このパッケージのアノテーションを参照する他のパッケージのインストール済みバージョンを使用しているユーザへの影響を考慮します。パッケージアップグレードを転送する前に、アップグレードが転送されると完全なコンパイルに失敗するパッケージバージョンを実行しているユーザがいないことを確認します。
次の例は、@namespaceAccessible アノテーションでマークされている Apex クラスを示します。このクラスは、同じ名前空間内の他のパッケージからアクセスできます。最初のコンストラクタも同じ名前空間内で参照できますが、2 つ目のコンストラクタは参照できません。
1// A namespace-visible Apex class
2@namespaceAccessible
3public class MyClass {
4 private Boolean bypassFLS;
5
6 // A namespace-visible constructor that only allows secure use
7 @namespaceAccessible
8 public MyClass() {
9 bypassFLS = false;
10 }
11
12 // A package private constructor that allows use in trusted contexts,
13 // but only internal to the package
14 public MyClass (Boolean bypassFLS) {
15 this.bypassFLS = bypassFLS;
16 }
17 @namespaceAccessible
18 protected Boolean getBypassFLS() {
19 return bypassFLS;
20 }
21}バージョン管理動作の変更
API バージョン 47.0 以降の場合、@AuraEnabled でマークされているエンティティでは、@NamespaceAccessible を使用できません。したがって、あるパッケージからインストールされた Aura または Lightning Web コンポーネントは、別のパッケージからの Apex メソッドをコールできません。これは、両方のパッケージが同じ名前空間に存在している場合であっても当てはまります。
API バージョン 50.0 以降の場合:
- public または protected で @namespaceAccessible アノテーションが付加された Apex 変数またはメソッドは、@namespaceAccessible アノテーションが付加された public クラスにある必要があります。
- public または protected で @namespaceAccessible アノテーションが付加された Apex 内部クラスは @namespaceAccessible アノテーションが付加された public 外部クラスで囲む必要があります。