附注
Apex 注解修改了方法或类的使用方式,类似于 Java 中的注解。注释使用初始符号定义,后跟相应的关键字。
@
若要向方法添加批注,请在方法或类之前指定它 定义。例如:
global class MyClass {
@Future
Public static void myMethod(String a)
{
//long-running Apex code
}
}
Apex 支持以下注解。
- @AuraEnabled
- @Deprecated
- @Future
- @InvocableMethod
- @InvocableVariable
- @IsTest
- @JsonAccess
- @NamespaceAccessible
- @ReadOnly
- @RemoteAction
- @SuppressWarnings
- @TestSetup
- @TestVisible
- Apex REST注解:
- @ReadOnly
- @RestResource(urlMapping=’/yourUrl‘)
- @HttpDelete
- @HttpGet
- @HttpPatch
- @HttpPost
- @HttpPut
- AuraEnabled 注解
- 已弃用的批注
- 未来注解
- InvocableMethod 注解 使用注解
来标识可作为可调用操作运行的方法。InvocableMethod - InvocableVariable 批注
使用批注来标识自定义类中可调用方法使用的变量。InvocableVariable - IsTest 注解
- JsonAccess 注解
- NamespaceAccessible 批注
- ReadOnly 注释
- RemoteAction 批注
- SuppressWarnings 注释
此注释在 Apex 中不执行任何操作,但可用于向第三方工具提供信息。 - TestSetup 批注 使用批注
定义的方法用于创建可用于类中所有测试方法的通用测试记录。@TestSetup - TestVisible 注解
AuraEnabled(Lightning启用)注解
该注释支持客户端和服务器端访问 Apex 控制器方法。 提供此注释后,您的方法可用于 Lightning 组件 (Lightning Web 组件和 Aura 组件)。只有这个方法 注解是公开的。@AuraEnabled
在 API 版本 44.0 及更高版本中,您可以通过缓存方法提高运行时性能 使用注释在客户端上生成结果。您只能缓存以下方法的结果 检索数据但不修改数据的方法。使用此注解可消除 需要调用 JavaScript 代码 在调用 Apex 方法的每个操作上。@AuraEnabled(cacheable=true)setStorable()
在 API 版本 55.0 及更高版本中,您可以使用注释使 Apex 方法成为 缓存在全局缓存中。@AuraEnabled(cacheable=true scope=’global’)
版本化行为更改
在 API 版本 55.0 及更高版本中,不允许对带有 注释的方法进行重载。@AuraEnabled
废弃的注解
使用注释来标识方法、类、异常、枚举、 接口或变量,这些接口或变量在后续版本的 被管理 它们所在的包。此注释在以下情况下很有用 随着需求的发展重构托管包中的代码。新订阅者 看不到已弃用的元素,而这些元素继续运行 现有订阅者和 API 集成。Deprecated
以下代码片段显示了已弃用的方法。一样 语法可用于弃用类、异常、枚举、接口、 或变量。
@Deprecated
// This method is deprecated. Use myOptimizedMethod(String a, String b) instead.
global void myMethod(String a) {
}
弃用 Apex 标识符时,请注意以下规则:
- 非托管包不能包含使用关键字的代码。deprecated
- 当 Apex 项被弃用时,引用已弃用的 Apex 项的所有全局访问修饰符 标识符也必须弃用。任何在其中使用弃用类型的全局方法 还必须弃用输入参数或方法返回类型中的签名。已弃用的项(如方法或类)可以 仍由包开发人员在内部引用。
- webservice方法和变量不能是 荒废的。
- 您可以弃用 ,但不能弃用 个人价值。enumenum
- 可以弃用接口,但不能弃用接口中的单个方法。
- 您可以弃用抽象类,但不能弃用 抽象类。
- 您无法删除批注 在发布软件包版本后,取消弃用 Apex 中的某些内容,其中 Apex 中的项已弃用。Deprecated
有关包版本的详细信息,请参阅什么是包?。
未来的注解
使用注释进行标识 异步执行的方法。当您指定 时,该方法将在 Salesforce 具有 可用资源。FutureFuture
例如,您可以在以下情况下使用注释 对外部服务进行异步 Web 服务标注。没有 注解时,Web 服务标注是由执行 Apex 代码,在标注完成之前,不能进行其他处理 (同步处理)。Future
带有注解的方法必须是静态方法,并且只能返回 void 类型。指定的 参数必须是基元数据类型、基元数据类型的数组或集合 的原始数据类型。带有注解的方法不能将 sObjects 或对象作为参数。FutureFuture
若要使类中的方法异步执行,请使用注释定义方法。例如:Future
global class MyFutureClass {
@Future
static void myMethod(String a, Integer i) {
System.debug('Method called with: ' + a + ' and ' + i);
// Perform long-running code
}
}
若要允许在方法中使用标注,请指定 。默认值为 ,这会阻止方法 进行标注。Future(callout=true)(callout=false)
以下代码片段演示如何指定方法执行 标注:
@Future (callout=true)
public static void doCalloutFromFuture() {
//Add code to perform callout
}
未来方法注意事项
- 请记住,任何使用注解的方法都需要特别考虑,因为该方法不一定 按调用的相同顺序执行。Future
- 带有注释的方法不能在 Visualforce 控制器中使用 要么是方法,要么在构造函数中。FuturegetMethodNamesetMethodName
- 不能从同样具有批注的方法调用批注的方法。也不能从调用 另一个带注释的方法。FutureFuture
InvocableMethod注解
使用注释来标识可以作为可调用运行的方法 行动。InvocableMethod
注意
如果流调用 Apex,则正在运行的用户必须具有相应的 Apex 类安全性 在其用户配置文件或权限集中设置。
可调用方法从交互的 Rest、Apex、Flow 或 Einstein 机器人中本机调用 与外部 API 源一起使用。可调用方法具有动态输入和输出值,并且 支持描述调用。
此代码示例演示具有基元数据类型的可调用方法。
public class AccountQueryAction {
@InvocableMethod(label='Get Account Names' description='Returns the list of account names corresponding to the specified account IDs.' category='Account')
public static List<String> getAccountNames(List<ID> ids) {
List<Account> accounts = [SELECT Name FROM Account WHERE Id in :ids];
Map<ID, String> idToName = new Map<ID, String>();
for (Account account : accounts) {
idToName.put(account.Id, account.Name);
}
// put each name in the output at the same position as the id in the input
List<String> accountNames = new List<String>();
for (String id : ids) {
accountNames.add(idToName.get(id));
}
return accountNames;
}
}
此代码示例演示具有特定 sObject 数据类型的可调用方法。
public class AccountInsertAction {
@InvocableMethod(label='Insert Accounts' description='Inserts the accounts specified and returns the IDs of the new accounts.' category= 'Account')
public static List<ID> insertAccounts(List<Account> accounts) {
Database.SaveResult[] results = Database.insert(accounts);
List<ID> accountIds = new List<ID>();
for (Database.SaveResult result : results) {
accountIds.add(result.getId());
}
return accountIds;
}
}
此代码示例演示具有泛型 sObject 数据类型的可调用方法。
public with sharing class GetFirstFromCollection {
@InvocableMethod
public static List<Results> execute (List<Requests> requestList) {
List<Results> results = new List<Results>();
for (Requests request : requestList) {
List<SObject> inputCollection = request.inputCollection;
SObject outputMember = inputCollection[0];
//Create a Results object to hold the return values
Results result = new Results();
//Add the return values to the Results object
result.outputMember = outputMember;
//Add Result to the results List at the same position as the request is in the requests List
results.add(result);
}
return results;
}
public class Requests {
@InvocableVariable(label='Records for Input' description='yourDescription' required=true)
public List<SObject> inputCollection;
}
public class Results {
@InvocableVariable(label='Records for Output' description='yourDescription' required=true)
public SObject outputMember;
}
}
此代码示例演示了具有 SVG 文件中自定义图标的可调用方法。
global class CustomSvgIcon {
@InvocableMethod(label='myIcon' iconName='resource:myPackageNamespace__google:top')
global static List<Integer> myMethod(List<Integer> request) {
List<Integer> results = new List<Integer>();
for(Integer reqInt : request) {
results.add(reqInt);
}
return results;
}
}
此代码示例显示了一个带有 Salesforce Lightning 自定义图标的可调用方法 设计系统(SLDS)。
public class CustomSldsIcon {
@InvocableMethod(iconName='slds:standard:choice')
public static void run() {}
}
支持的修饰符
所有修饰符都是可选的。标签方法的标签,在流生成器中显示为操作名称。这 默认值是方法名称,但我们建议您提供标签。描述方法的说明,在流中显示为操作说明 建筑工人。缺省值为 。Null标注标注修饰符标识该方法是否调用外部系统。如果 该方法调用外部系统,添加 .缺省值为 。callout=truefalse类别方法的类别,在 Flow Builder 中显示为操作类别。 如果未提供类别(默认情况下),则操作将显示在“未分类”下。配置编辑器使用方法注册并显示在 Flow 中的自定义属性编辑器 管理员配置操作时的生成器。如果未指定此修饰符,则 Flow 生成器使用标准属性编辑器。图标名称要用作 Flow Builder 中操作的自定义图标的图标的名称 帆布。您可以将上传的 SVG 文件指定为静态资源,也可以将 Salesforce Lightning Design System 标准图标。
InvocableMethod 注意事项
实施说明
- 可调用方法必须是 and 或 ,并且其类必须是外部类。staticpublicglobal
- 一个类中只有一个方法可以具有注释。InvocableMethod
- 其他批注不能与批注一起使用。InvocableMethod
输入和输出最多可以有一个输入参数,其数据类型必须为以下参数之一:
- 基元数据类型的列表或基元数据类型的列表列表 – 泛型类型不是 支持。Object
- sObject 类型的列表或 sObject 类型的列表列表。
- 泛型 sObject 类型 () 的列表或泛型 sObject 类型的列表 ().List<sObject>List<List<sObject>>
- 用户定义类型的列表,包含受支持类型的变量或 用户定义的 Apex 类型,带有注释。要实现您的数据类型,请创建一个 自定义全局或公共 Apex 类。该类必须包含至少一个成员 变量,带有可调用的变量注解。InvocableVariable
如果返回类型不是 ,则数据 方法返回的类型必须是下列类型之一:Null
- 基元数据类型的列表或基元数据类型的列表列表 – 泛型类型不是 支持。Object
- sObject 类型的列表或 sObject 类型的列表列表。
- 泛型 sObject 类型 () 的列表或泛型 sObject 类型的列表 ().List<sObject>List<List<sObject>>
- 用户定义类型的列表,包含受支持类型的变量或 用户定义的 Apex 类型,带有注释。要实现您的数据类型,请创建一个 自定义全局或公共 Apex 类。该类必须包含至少一个成员 变量,带有可调用的变量注解。InvocableVariable注意为了正确的膨胀 实现时,输入和输出的大小和顺序必须匹配。 例如,第 i 个“输出”条目必须与第 i 个“输入”条目相对应。 当您的操作在 批量执行,例如在记录触发器中使用 Apex 操作时 流。
托管软件包
- 可以在包中使用可调用方法,但在添加可调用方法后 无法将其从更高版本的包中删除。
- 公共可调用方法可由 托管包。
- 全局可调用方法可以在订阅者组织中的任何位置引用。只 全局可调用方法显示在 Flow Builder 和 Process Builder 的 订阅者组织。
有关可调用操作的详细信息,请参阅操作开发人员指南。
Invocable变量注解
使用注释来标识 自定义类。InvocableVariable
注释标识类 变量,用作方法的可调用操作的输入或输出参数。如果创建自己的自定义类以 用作可调用方法的输入或输出,可以对单个类成员进行注释 变量,使它们可供方法使用。InvocableVariableInvocableMethod
下面的代码示例演示了具有 invocable 变量的 invocable 方法。
global class ConvertLeadAction {
@InvocableMethod(label='Convert Leads')
global static List<ConvertLeadActionResult> convertLeads(List<ConvertLeadActionRequest> requests) {
List<ConvertLeadActionResult> results = new List<ConvertLeadActionResult>();
for (ConvertLeadActionRequest request : requests) {
results.add(convertLead(request));
}
return results;
}
public static ConvertLeadActionResult convertLead(ConvertLeadActionRequest request) {
Database.LeadConvert lc = new Database.LeadConvert();
lc.setLeadId(request.leadId);
lc.setConvertedStatus(request.convertedStatus);
if (request.accountId != null) {
lc.setAccountId(request.accountId);
}
if (request.contactId != null) {
lc.setContactId(request.contactId);
}
if (request.overWriteLeadSource != null && request.overWriteLeadSource) {
lc.setOverwriteLeadSource(request.overWriteLeadSource);
}
if (request.createOpportunity != null && !request.createOpportunity) {
lc.setDoNotCreateOpportunity(!request.createOpportunity);
}
if (request.opportunityName != null) {
lc.setOpportunityName(request.opportunityName);
}
if (request.ownerId != null) {
lc.setOwnerId(request.ownerId);
}
if (request.sendEmailToOwner != null && request.sendEmailToOwner) {
lc.setSendNotificationEmail(request.sendEmailToOwner);
}
Database.LeadConvertResult lcr = Database.convertLead(lc, true);
if (lcr.isSuccess()) {
ConvertLeadActionResult result = new ConvertLeadActionResult();
result.accountId = lcr.getAccountId();
result.contactId = lcr.getContactId();
result.opportunityId = lcr.getOpportunityId();
return result;
} else {
throw new ConvertLeadActionException(lcr.getErrors()[0].getMessage());
}
}
global class ConvertLeadActionRequest {
@InvocableVariable(required=true)
global ID leadId;
@InvocableVariable(required=true)
global String convertedStatus;
@InvocableVariable
global ID accountId;
@InvocableVariable
global ID contactId;
@InvocableVariable
global Boolean overWriteLeadSource;
@InvocableVariable
global Boolean createOpportunity;
@InvocableVariable
global String opportunityName;
@InvocableVariable
global ID ownerId;
@InvocableVariable
global Boolean sendEmailToOwner;
}
global class ConvertLeadActionResult {
@InvocableVariable
global ID accountId;
@InvocableVariable
global ID contactId;
@InvocableVariable
global ID opportunityId;
}
class ConvertLeadActionException extends Exception {}
}
以下代码示例演示了一个 invocable 方法,该方法具有 泛型 sObject 数据类型。
public with sharing class GetFirstFromCollection {
@InvocableMethod
public static List <Results> execute (List<Requests> requestList) {
List<SObject> inputCollection = requestList[0].inputCollection;
SObject outputMember = inputCollection[0];
//Create a Results object to hold the return values
Results response = new Results();
//Add the return values to the Results object
response.outputMember = outputMember;
//Wrap the Results object in a List container
//(an extra step added to allow this interface to also support bulkification)
List<Results> responseWrapper= new List<Results>();
responseWrapper.add(response);
return responseWrapper;
}
}
public class Requests {
@InvocableVariable(label='Records for Input' description='yourDescription' required=true)
public List<SObject> inputCollection;
}
public class Results {
@InvocableVariable(label='Records for Output' description='yourDescription' required=true)
public SObject outputMember;
}
}
支持的修饰符
可调用变量注释支持此示例中所示的修饰符。
@InvocableVariable(label=’yourLabel‘ description=’yourDescription‘ required=(true | false))所有修饰符都是可选的。标签变量的标签。默认值为变量名称。
提示
此标签显示在 Flow Builder 中 Action 元素的 Action 元素中 对应于可调用的方法。此标签可帮助管理员了解如何使用 流中的变量。描述变量的说明。缺省值为 。Null必填指定变量是否为必需变量。如果未指定,则默认值为 false。 对于输出变量,将忽略该值。
InvocableVariable 注意事项
- 其他批注不能与批注一起使用。InvocableVariable
- 只有全局变量和公共变量才能是可调用变量。
- 可调用变量不能是以下变量之一:
- 非成员变量,如 a 或 变量。staticlocal
- 属性。
- 一个变量。final
- Protected或。private
- 可调用变量的数据类型必须为下列类型之一:
- Object 以外的基元
- sObject,泛型 sObject 或特定 sObject
- 从 Apex 创建的基元、sObjects、对象列表的列表或列表 类或集合
- Apex 中的可调用变量名称必须与流程中的名称匹配。名称区分大小写。
- 对于托管软件包:
- 公共可调用变量可以在同一托管的流和流程中设置 包。
- 全局可调用变量可以在订阅者组织中的任何位置设置。只有全球 可调用变量显示在订阅者的 Flow Builder 和 Process Builder 中 组织。
IsTest的注解
使用注释 定义仅包含用于测试应用程序的代码的类和方法。这 注释可以在括号内使用多个修饰符,并用空格分隔。@IsTest
注意
上的注释 methods 等同于关键字。如 最佳做法,Salesforce 建议您使用 而不是 .关键字可以在 未来版本。@IsTesttestMethod@IsTesttestMethodtestMethod
类和方法定义为 can be 或 。定义为的类必须是顶级类。@IsTestprivatepublic@IsTest
注意
使用注释定义的类不计入组织 6 MB 的限制 所有 Apex 代码。@IsTest
@IsTest
private class MyTestClass {
// Methods for testing
@IsTest
static void test1() {
// Implement test code
}
@IsTest
static void test2() {
// Implement test code
}
}
下面是包含实用程序的公共测试类的示例 测试数据的方法 创造:
@IsTest
public class TestUtil {
public static void createTestAccounts() {
// Create some test accounts
}
public static void createTestContacts() {
// Create some test contacts
}
}
定义为 不能是接口或 枚举。@IsTest
公共测试类的方法只能从 运行测试,即测试方法或测试方法调用的代码。非测试 请求不能调用公共方法。.要了解各种方法,请执行以下操作 运行测试方法,请参阅运行单元测试方法。
@IsTest(SeeAllData=true)注解
对于使用 Salesforce API 版本 24.0 保存的 Apex 代码 稍后,使用注解授予测试类和 单个测试方法访问组织中的所有数据。交通 包括测试未创建的预先存在的数据。从 Apex 代码开始 使用 Salesforce API 版本 24.0 保存,测试方法无权访问 组织中预先存在的数据。但是,保存的测试代码 Salesforce API 版本 23.0 及更早版本继续可以访问 组织。@IsTest(SeeAllData=true)请参见在单元测试中将测试数据与组织数据隔离。注释的注意事项@IsTest(SeeAllData=true)
- 如果测试类是用注解定义的,则 未显式设置关键字的测试方法。@IsTest(SeeAllData=true)SeeAllData=trueSeeAllData
- 注解用于打开 在类或方法级别应用时的数据访问。但是,如果 包含类已用 、 对于方法,将忽略对方法进行批注。 在这种情况下,该方法仍然可以访问 组织。使用重写对方法进行注释,对于该方法,对 类。@IsTest(SeeAllData=true)@IsTest(SeeAllData=true)@IsTest(SeeAllData=false)@IsTest(SeeAllData=true)@IsTest(SeeAllData=false)
- @IsTest(SeeAllData=true)并且不能使用注释 一起使用相同的 Apex 方法。@IsTest(IsParallel=true)
此示例演示如何使用注释定义测试类。所有 此类中的测试方法可以访问 组织。
@IsTest(SeeAllData=true)
// All test methods in this class can access all data.
@IsTest(SeeAllData=true)
public class TestDataAccessClass {
// This test accesses an existing account.
// It also creates and accesses a new test account.
@IsTest
static void myTestMethod1() {
// Query an existing account in the organization.
Account a = [SELECT Id, Name FROM Account WHERE Name='Acme' LIMIT 1];
System.assert(a != null);
// Create a test account based on the queried account.
Account testAccount = a.clone();
testAccount.Name = 'Acme Test';
insert testAccount;
// Query the test account that was inserted.
Account testAccount2 = [SELECT Id, Name FROM Account
WHERE Name='Acme Test' LIMIT 1];
System.assert(testAccount2 != null);
}
// Like the previous method, this test method can also access all data
// because the containing class is annotated with @IsTest(SeeAllData=true).
@IsTest
static void myTestMethod2() {
// Can access all data in the organization.
}
}
第二个示例演示如何在测试上应用注释 方法。由于测试方法的类没有注释,因此必须注释 方法,以便能够访问该方法的所有数据。第二种测试方法没有 具有此注释,因此它只能访问它创建的数据。此外,它还可以 访问用于管理组织的对象,例如 用户。
@IsTest(SeeAllData=true)
// This class contains test methods with different data access levels.
@IsTest
private class ClassWithDifferentDataAccess {
// Test method that has access to all data.
@IsTest(SeeAllData=true)
static void testWithAllDataAccess() {
// Can query all data in the organization.
}
// Test method that has access to only the data it creates
// and organization setup and metadata objects.
@IsTest
static void testWithOwnDataAccess() {
// This method can still access the User object.
// This query returns the first user object.
User u = [SELECT UserName,Email FROM User LIMIT 1];
System.debug('UserName: ' + u.UserName);
System.debug('Email: ' + u.Email);
// Can access the test account that is created here.
Account a = new Account(Name='Test Account');
insert a;
// Access the account that was just created.
Account insertedAcct = [SELECT Id,Name FROM Account
WHERE Name='Test Account'];
System.assert(insertedAcct != null);
}
}
@IsTest(OnInstall=true)注解
使用注释指定哪些 Apex 测试是 在软件包安装期间执行。此注释用于托管中的测试 或非托管包。仅测试具有此注释的方法,或具有此注释的方法 具有此注释的测试类的一部分在打包过程中执行 安装。@IsTest(OnInstall=true)注释为在打包期间运行的测试 安装必须通过才能成功安装包。不是 在软件包安装期间绕过失败测试的可能性更长。没有此注释的测试方法或类, 或者,在安装过程中不会执行带有 或 注释的。@IsTest(OnInstall=false)@IsTest
在包安装和升级期间运行的带批注的测试不计入代码覆盖率。 但是,在包创建操作期间会跟踪和计算代码覆盖率。 因为从托管软件包安装的 Apex 代码被排除在组织级别之外 对代码覆盖率的要求,您不太可能受到影响。但是,如果你 跟踪托管包测试覆盖率,则必须在 要更新代码覆盖率统计信息的包安装或升级操作。 包安装不会被代码覆盖率要求阻止。IsTest(OnInstall=true)
此示例演示如何对测试方法进行批注,该方法为 在软件包安装期间执行。在此示例中,已执行,但未执行。test1test2test3
public class OnInstallClass {
// Implement logic for the class.
public void method1(){
// Some code
}
}
@IsTest
private class OnInstallClassTest {
// This test method will be executed
// during the installation of the package.
@IsTest(OnInstall=true)
static void test1() {
// Some test code
}
// Tests excluded from running during the
// the installation of a package.
@IsTest
static void test2() {
// Some test code
}
@IsTest
static void test3() {
// Some test code
}
}
@IsTest(IsParallel=true)注解
使用注释来指示测试类 可以并行运行。对并发测试数的默认限制没有 适用于这些测试课程。此注解使测试类的执行 效率更高,因为可以并行运行更多测试。@IsTest(IsParallel=true)注释的注意事项@IsTest(IsParallel=true)
- 此注释将覆盖禁用并行的设置 测试。
- @IsTest(SeeAllData=true)和注释不能在同一个 Apex 方法上一起使用。@IsTest(IsParallel=true)
JsonAccess注解
在 Apex 类中定义的注释 级别控制类的实例是否可以序列化或反序列化。如果 注解限制了 JSON 序列化和反序列化,抛出运行时异常。@JsonAccessJSONException注解的 和 参数强制执行 Apex 允许序列化和 反序列化。您可以指定一个或两个参数,但不能指定注释 没有参数。参数的有效值,用于指示序列化和 允许反序列化:
serializabledeserializable@JsonAccess
- never:从不允许
- sameNamespace:仅允许 Apex 代码 相同的命名空间
- samePackage:仅允许 Apex 代码 相同的包(仅影响第二代包)
- always:始终允许任何 Apex 代码
JsonAccess考虑
- 如果注释为 扩展时,扩展类不继承此属性。JsonAccess
- 如果将该方法应用于对象 这不能被序列化,私人数据可以被暴露。您必须在必须保护其数据的对象上重写该方法。 例如,序列化在 Map 中存储为键的对象会调用该方法。生成的映射包括键(字符串) 和值条目,从而公开对象的所有字段。toStringtoStringtoString
此示例代码显示了一个标有注释的 Apex 类。@JsonAccess
// SomeSerializableClass is serializable in the same package and deserializable in the wider namespace
@JsonAccess(serializable='samePackage' deserializable=’sameNamespace’)
public class SomeSerializableClass { }
// AlwaysDeserializable class is always deserializable and serializable only in the same namespace (default value from version 49.0 onwards)
@JsonAccess(deserializable=’always’)
public class AlwaysDeserializable { }
版本化行为更改
在版本 48.0 及更早版本中,反序列化的默认访问权限是,序列化的默认访问权限是保留现有行为。从 从版本 49.0 开始,序列化和反序列化的默认访问权限为 。alwayssameNamespacesameNamespace
命名空间可访问注解
在 包可用于使用相同命名空间的其他包。没有这个 注解、定义的 Apex 类、方法、接口、属性和抽象类 在 2GP 包中,无法被与它们共享的其他包访问 命名空间。声明为全局的 Apex 在所有命名空间中始终可用,并且 不需要注释。@NamespaceAccessible
有关 2GP 托管包的详细信息,请参阅第二代托管包 Salesforce DX 开发人员指南中的软件包。
跨 Apex 可访问性的注意事项 包
- 不能将注释用于 Apex 方法。@NamespaceAccessible@AuraEnabled
- 您可以随时添加或删除批注,即使在托管上也是如此 并发布了 Apex 代码。确保没有依赖包 在添加或删除之前依赖注释的功能 它。@NamespaceAccessible
- 在软件包中添加或删除 Apex 时,请考虑影响 对于安装了引用此包的其他包版本的客户 包的注解。在推送软件包升级之前,请确保没有 客户正在运行的包版本在以下情况下无法完全编译 已推送升级。@NamespaceAccessible
- 如果公共接口声明为 ,则所有接口成员都继承 注解。不能使用 对单个接口成员进行注释。@NamespaceAccessible@NamespaceAccessible
- 如果将公共变量或受保护的变量或方法声明为 ,则其定义类 必须是全局的或带有注释的公共的。@NamespaceAccessible@NamespaceAccessible
- 如果将公共或受保护的内部类声明为 ,则其封闭式 类必须是带有注释的全局类或公共类。@NamespaceAccessible@NamespaceAccessible
此示例显示一个标有批注的 Apex 类。这 类可供同一命名空间中的其他包访问。第一个 构造函数在命名空间中也可见,但第二个构造函数不可见。
@NamespaceAccessible
// A namespace-visible Apex class
@NamespaceAccessible
public class MyClass {
private Boolean bypassFLS;
// A namespace-visible constructor that only allows secure use
@NamespaceAccessible
public MyClass() {
bypassFLS = false;
}
// A package private constructor that allows use in trusted contexts,
// but only internal to the package
public MyClass (Boolean bypassFLS) {
this.bypassFLS = bypassFLS;
}
@NamespaceAccessible
protected Boolean getBypassFLS() {
return bypassFLS;
}
}
版本化行为更改
在 API 版本 47.0 及更高版本中@NamespaceAccessible,不允许在标有 @AuraEnabled。因此,从软件包安装的 Aura 或 Lightning Web 组件不能 从另一个包调用 Apex 方法,即使两个包位于同一命名空间中。
在 API 版本 50.0 及更高版本中,范围和可访问性规则在 Apex 上强制执行 用 注释的变量、方法、内部类和接口。出于辅助功能考虑, 请参阅 Apex 的注意事项 跨软件包的可访问性。有关基于命名空间的可见性的详细信息, 请参阅 Apex 的基于命名空间的可见性 第二代包中的类。@NamespaceAccessible
只读注解
该注释允许您 通过增加限制,对 Lightning 平台数据库执行限制较少的查询 请求返回的行数为 1,000,000。所有其他限制仍然适用。这 注释会阻止请求中的以下操作:DML 操作、对 的调用和排队的异步 Apex 作业。@ReadOnlySystem.schedule
注释可用于 REST 和 SOAP Web 服务以及接口。若要使用注释,顶级请求必须位于计划中 执行或 Web 服务调用。例如,如果 Visualforce 页面调用 包含批注的 Web 服务,请求失败,因为 Visualforce 是顶级请求,而不是 Web 服务。@ReadOnlySchedulable@ReadOnly@ReadOnly
Visualforce 页面可以使用注释调用控制器方法,这些方法使用 同样放宽了限制。要增加其他特定于 Visualforce 的限制,例如 作为可供迭代组件使用的集合的大小,例如 ,您可以将标记上的属性设置为 。有关更多信息,请参见 Visualforce Developer 的 指南。@ReadOnly<apex:pageBlockTable>readonly<apex:page>true
版本化行为更改
在 API 版本 49.0 之前,在 Apex 上使用 还需要 REST 方法(@HttpDelete、@HttpGet、@HttpPatch、@HttpPost 或 @HttpPut) 用 注释方法。在 API 中 版本 49.0 及更高版本中,您可以仅使用 .@ReadOnly@RemoteAction@ReadOnly
远程操作注解
注释 支持通过 JavaScript 调用 Visualforce 中使用的 Apex 方法。这 进程通常称为 JavaScript 远程处理。RemoteAction
注意
带有注释的方法必须是 和 或 。RemoteActionstaticglobalpublic将 Apex 类作为自定义控制器或控制器扩展添加到 页。
<apex:page controller="MyController" extension="MyExtension">
警告
添加控制器或控制器扩展将授予对该 Apex 类中所有方法的访问权限,即使这些方法 页面中不使用方法。任何可以查看该页面的人都可以执行所有方法,并向 控制器。@RemoteAction@RemoteAction然后,将请求添加为 JavaScript 函数调用。一个简单的 JavaScript 远程调用采用以下方法 形式。
[namespace.]MyController.method(
[parameters...,]
callbackFunction,
[configuration]
);
元素 | 描述 |
---|---|
namespace | 控制器类的命名空间。如果出现以下情况,则 namespace 元素是必需的 您的组织定义了一个命名空间,或者该类是否来自已安装的 包。 |
MyController,MyExtension | Apex 控制器或扩展的名称。 |
method | 要调用的 Apex 方法的名称。 |
parameters | 方法采用的参数的逗号分隔列表。 |
callbackFunction | 处理来自 控制器。还可以以内联方式声明匿名函数。 接收方法的状态 调用和结果作为参数。callbackFunction |
configuration | 配置远程呼叫和响应的处理。使用此元素可以 更改远程处理调用的行为,例如是否转义 Apex 方法的响应。 |
在控制器中,Apex 方法声明前面带有类似 这:
@RemoteAction
@RemoteAction
global static String getItemId(String objectName) { ... }
Apex 方法必须是 和 或 。
@RemoteActionstaticglobalpublic
您的方法可以采用 Apex 基元、集合、类型化和泛型 sObjects,以及 用户定义的 Apex 类和接口作为参数。通用 sObject 必须具有 ID 或 sobjectType 值来标识实际类型。接口参数必须具有 apexType 确定实际类型。您的方法可以返回 Apex 基元、sObjects、集合、 用户定义的 Apex 类和枚举、 、 、 或 。SaveResultUpsertResultDeleteResultSelectOptionPageReference
有关详细信息,请参阅《Visualforce 开发人员指南》中的“适用于 Apex 控制器的 JavaScript 远程处理”。
抑制警告注解
此注释在 Apex 中不执行任何操作,但可用于向 第三方工具。
注释在 Apex 中不执行任何操作,但可用于向 第三方工具。@SuppressWarnings
测试设置注解
使用注解定义的方法 用于创建可用于 类。
@TestSetup
语法
测试设置方法是在测试类中定义的,不带任何参数,也不返回任何值。这 以下是测试设置方法的语法。
@TestSetup static void methodName() {
}
如果测试类包含测试设置方法,则测试框架将执行测试设置 方法,在类中的任何测试方法之前。在测试设置中创建的记录 方法可用于测试类中的所有测试方法,并在 测试类执行。如果测试方法更改了这些记录,例如记录字段更新或 记录删除,这些更改将在每个测试方法完成执行后回滚。这 接下来,执行测试方法可以访问这些记录的原始未修改状态。
注意
每个测试类只能有一种测试设置方法。
只有测试类的默认数据隔离模式才支持测试设置方法。 如果测试类或测试方法可以使用批注访问组织数据, 此类不支持测试设置方法。因为测试的数据隔离 适用于 API 版本 24.0 及更高版本,也提供测试设置方法 仅适用于这些版本。@IsTest(SeeAllData=true)
测试可见注解
使用注释 允许测试方法访问另一个成员的私有或受保护成员 测试类之外的类。这些成员包括方法、成员 变量和内部类。此注释可实现更宽松的 仅用于运行测试的访问级别。此注解不 如果非测试类访问成员,则更改成员的可见性。TestVisible
使用此注释,您不必更改方法的访问修饰符,并且 如果要在测试方法中访问它们,则将变量添加到 public。例如,如果 私有成员变量不应该暴露给外部类,但它 必须可通过测试方法访问,才能将注释添加到变量定义中。TestVisible
此示例演示如何对私有类成员变量进行批注 和私有方法。TestVisible
public class TestVisibleExample {
// Private member variable
@TestVisible private static Integer recordNumber = 1;
// Private method
@TestVisible private static void updateRecord(String name) {
// Do something
}
}
此测试类使用上一个类,并包含访问带注释的 成员变量和方法。
@IsTest
private class TestVisibleExampleTest {
@IsTest static void test1() {
// Access private variable annotated with TestVisible
Integer i = TestVisibleExample.recordNumber;
System.assertEquals(1, i);
// Access private method annotated with TestVisible
TestVisibleExample.updateRecord('RecordName');
// Perform some verification
}
}
Apex REST 注解
使用这些注解将 Apex 类公开为 RESTful Web 服务。
- @ReadOnly
- @RestResource(urlMapping=’/yourUrl‘)
- @HttpDelete
- @HttpGet
- @HttpPatch
- @HttpPost
- @HttpPut
RestResource Annotation
注释用于 类级别,使您能够将 Apex 类公开为 REST 资源。@RestResource使用此注释时的一些注意事项:
- URL 映射是相对于 https:// instance.salesforce.com/services/apexrest/ 的。
- URL 映射可以包含通配符 (*)。
- URL 映射区分大小写。例如,的 URL 映射与包含 而不是 的 REST 资源匹配。my_urlmy_urlMy_Url
- 要使用此注释,必须将 Apex 类定义为全局类。
URL 准则
URL 路径映射如下所示:
- 路径必须以正斜杠 (/) 开头。
- 路径长度最多为 255 个字符。
- 路径中出现的通配符 (*) 前面必须有正斜杠 (/)。 此外,除非通配符是路径中的最后一个字符,否则必须遵循通配符 正斜杠 (/)。
映射 URL 的规则如下:
- 完全匹配总是获胜。
- 如果未找到完全匹配项,请查找具有匹配通配符的所有模式,然后选择 其中最长的(按字符串长度计算)。
- 如果未找到通配符匹配项,则返回 HTTP 响应状态代码 404。
命名空间类的 URL 包含命名空间。例如,如果您的类位于命名空间中,并且该类映射到 ,则 API URL 将修改如下:https:// instance.salesforce.com/services/apexrest/abc/your_url/。 在发生 URL 冲突的情况下,始终使用命名空间类。abcyour_url
Http删除注解
注释在方法级别使用 并使您能够将 Apex 方法公开为 REST 资源。此方法在发送 HTTP 请求时调用,并删除指定的 资源。@HttpDeleteDELETE
HttpGet的注解
注释用于方法级别和 使您能够将 Apex 方法公开为 REST 资源。此方法在发送 HTTP 请求时调用,并返回指定的 资源。@HttpGetGET以下是使用此注释时的一些注意事项:
- 若要使用此注释,必须将 Apex 方法定义为全局静态方法。
- 注释的方法也称为 if HTTP 请求使用 request 方法。@HttpGetHEAD
HttpPatch 的注解
注释在方法级别使用 并使您能够将 Apex 方法公开为 REST 资源。此方法在发送 HTTP 请求时调用,并更新指定的 资源。@HttpPatchPATCH
若要使用此注释,必须将 Apex 方法定义为全局静态方法。
HttpPost的注解
注释用于方法 级别,并使您能够将 Apex 方法公开为 REST 资源。此方法称为 发送 HTTP 请求时,并创建一个 新资源。@HttpPostPOST
若要使用此注释,必须将 Apex 方法定义为全局静态方法。
HttpPut 的注解
注释用于方法级别和 使您能够将 Apex 方法公开为 REST 资源。此方法在发送 HTTP 请求时调用,并创建或更新指定的 资源。@HttpPutPUT
若要使用此注释,必须将 Apex 方法定义为全局静态方法。