
Understanding @AuraEnabled Annotation

Table Of Contents
- What is @AuraEnabled?
- Example of @AuraEnabled Method:
- Usage in Lightning Component:
- Basic @AuraEnabled Method
- Bulkified @AuraEnabled Method
- Frequently Asked Questions (FAQs)
- What is the purpose of the @AuraEnabled annotation in Salesforce?
- Is data returned by @AuraEnabled methods automatically serialized for the client?
- How do you pass parameters to an @AuraEnabled method from a Lightning component?
The @AuraEnabled
annotation is pivotal in Salesforce development, serving as the gateway for communication between Apex classes and Lightning components, encompassing both Lightning Web Components and Aura Components.
It primarily allows you to expose specific methods in Apex classes to the client-side, making them accessible within your Lightning components. Without this annotation, methods in Apex remain inaccessible to the front-end, thereby limiting the dynamic interaction between the server-side logic and client-side presentation.
Lastly, thorough testing of these methods is imperative to ensure expected behavior and to achieve the required test coverage, safeguarding the stability and reliability of your Salesforce application.
See also: Salesforce Apex Annotations
CRS Info Solutions offers a comprehensive and dynamic Salesforce online course career building program for beginners, covering admin, developer, and LWC concepts. This course features immersive real-time projects, interactive hands-on learning, detailed daily notes, essential interview questions, thorough certification preparation, and strategic job prep guidance. Join their inspiring free demo to embark on an exciting Salesforce journey with expert mentorship and unlock your full potential in the Salesforce ecosystem. Enroll for a free demo today!
What is @AuraEnabled?
In Salesforce, @AuraEnabled
is an annotation used in Apex classes and methods to enable them to be called from Lightning components, such as Aura or Lightning Web Components (LWC). It acts as a bridge between the server-side logic (Apex) and the client-side framework (Aura or LWC). Without this annotation, methods in Apex classes cannot be accessed directly by these components.
Key Features of @AuraEnabled
:
- Enable Server-Side Access:It allows methods or properties in Apex to be invoked by client-side JavaScript in Lightning components.
- Data Serialization:Ensures that data returned by the annotated methods is serialized into a format that can be understood by the client-side framework.
- Two-Way Communication:Supports interaction between the client (Aura or LWC) and server (Apex), enabling dynamic and interactive components.
- Can Be Used with Variables:Public properties in Apex classes can also be marked with
@AuraEnabled
to make them accessible in Lightning components.
Example of @AuraEnabled
Method:
public with sharing class AccountController {
@AuraEnabled
public static List<Account> getAccounts() {
return [SELECT Id, Name FROM Account LIMIT 10];
}
}
In this example:
- The
getAccounts
method is annotated with@AuraEnabled
, making it callable from a Lightning component. - It retrieves a list of 10 accounts and sends it back to the component.
Example of @AuraEnabled
Property:
public class AccountData {
@AuraEnabled
public String accountName { get; set; }
}
The accountName
property is annotated with @AuraEnabled
, making it accessible and modifiable by the client-side framework.
Usage in Lightning Component:
// JavaScript controller in Lightning component
import getAccounts from '@salesforce/apex/AccountController.getAccounts';
getAccounts()
.then(result => {
console.log(result); // Logs the list of accounts
})
.catch(error => {
console.error(error); // Logs any errors
});
Below are examples of how to use the @AuraEnabled
annotation in Apex to expose methods to Lightning Components, along with best practices like error handling and bulkification.
Start learning Salesforce online course under an experienced mentor. Enroll for a free demo
Basic @AuraEnabled
Method
public class AccountController {
@AuraEnabled(cacheable=true)
public static Account getAccountById(Id accountId) {
try {
return [SELECT Id, Name, Industry, NumberOfEmployees FROM Account WHERE Id = :accountId LIMIT 1];
}
catch (Exception e) {
throw new AuraHandledException('Error retrieving account: ' + e.getMessage());
}
}
Master the Database methods in Salesforce Apex to perform sophisticated database operations with ease.
@AuraEnabled
Method with Parameters and Error Handling
public class ContactController {
@AuraEnabled
public static List<Contact> getContactsByAccountId(Id accountId) {
try {
return [SELECT Id, FirstName, LastName, Email, Phone FROM Contact WHERE AccountId = :accountId];
} catch (QueryException e) {
throw new AuraHandledException('Error fetching contacts: ' + e.getMessage());
}
}
}
Preparing for your next Salesforce interview? Check out these essential Salesforce interview questions and answers to give you an edge.
Bulkified @AuraEnabled
Method
public class OpportunityController {
@AuraEnabled(cacheable=true)
public static Map<Id, List<Opportunity>> getOpportunitiesForAccounts(List<Id> accountIds) {
Map<Id, List<Opportunity>> opportunitiesMap = new Map<Id, List<Opportunity>>();
try {
List<Opportunity> opportunities = [SELECT Id, Name, CloseDate, StageName, Amount FROM Opportunity WHERE AccountId IN :accountIds];
for (Opportunity opp : opportunities) {
if (!opportunitiesMap.containsKey(opp.AccountId)) {
opportunitiesMap.put(opp.AccountId, new List<Opportunity>());
}
opportunitiesMap.get(opp.AccountId).add(opp);
}
} catch (Exception e) {
throw new AuraHandledException('Error retrieving opportunities: ' + e.getMessage());
}
return opportunitiesMap;
}
}
In these examples:
- Basic
@AuraEnabled
Method: Demonstrates a simple method to retrieve a single account based on the ID. - Method with Parameters and Error Handling: Shows how to pass parameters to an
@AuraEnabled
method and handle potential errors gracefully. - Bulkified Method: Illustrates how to write a bulkified method that accepts a list of IDs, retrieves data in bulk, and organizes the data efficiently to avoid hitting governor limits.
See also: Top 10 interviews questions on Salesforce Annotations with coding examples
Remember to perform proper testing and ensure that your Apex classes respect Salesforce’s security model, including sharing rules and field-level permissions.
Frequently Asked Questions (FAQs)
1. What is the purpose of the @AuraEnabled
annotation in Salesforce?
The @AuraEnabled
annotation allows Apex methods or properties to be accessed from Lightning components (Aura or LWC). It bridges the client-side framework and server-side logic.
Example:
public with sharing class AccountController {
@AuraEnabled
public static List<Account> getAccounts() {
return [SELECT Id, Name FROM Account LIMIT 10];
}
}
Here, the getAccounts
method is accessible from a Lightning component.
Start learning Salesforce online training under an experienced mentor. Enroll for a free demo
2. Can @AuraEnabled
be used with both Aura components and Lightning Web Components (LWC)?
Yes, @AuraEnabled
can be used with both Aura and LWC. The same annotation is applicable for both frameworks.
Example for Aura:
@AuraEnabled
public static List<Contact> getContacts() {
return [SELECT Id, Name FROM Contact LIMIT 5];
}
JavaScript in Aura:
evar action = component.get("c.getContacts");
action.setCallback(this, function(response) {
console.log(response.getReturnValue());
});
$A.enqueueAction(action);
Example for LWC:
import getContacts from '@salesforce/apex/AccountController.getContacts';
getContacts()
.then(data => console.log(data))
.catch(error => console.error(error));
3. Are @AuraEnabled
methods required to be static?
Yes, methods annotated with @AuraEnabled
must be declared static
to be invoked from a Lightning component.
Example:
public with sharing class OpportunityController {
@AuraEnabled
public static List<Opportunity> getOpportunities() {
return [SELECT Id, Name FROM Opportunity LIMIT 10];
}
}
The getOpportunities
method is static, ensuring it can be accessed by a Lightning component.
4. Can @AuraEnabled
be used to expose variables in Apex classes
Yes, @AuraEnabled
can be used to expose public variables (properties) in Apex classes.
Example:
public class AccountData {
@AuraEnabled
public String accountName { get; set; }
@AuraEnabled
public AccountData(String name) {
this.accountName = name;
}
}
The accountName
property is accessible to Lightning components.
5. Is data returned by @AuraEnabled
methods automatically serialized for the client?
Yes, Salesforce automatically serializes data returned by @AuraEnabled
methods into JSON format for use by Lightning components.
Example:
@AuraEnabled
public static Map<String, String> getSerializedData() {
Map<String, String> data = new Map<String, String>();
data.put('key1', 'value1');
data.put('key2', 'value2');
return data;
}
JavaScript in LWC:
import getSerializedData from '@salesforce/apex/AccountController.getSerializedData';
getSerializedData()
.then(data => {
console.log(data); // Logs: {key1: "value1", key2: "value2"}
})
.catch(error => {
console.error(error);
});
Start learning Salesforce online training under an experienced mentor. Enroll for a free demo
6. What are the security considerations when using @AuraEnabled
?
Security is crucial when exposing methods with @AuraEnabled
. Ensure only necessary data is exposed and validate input parameters to prevent malicious use. Always apply field- and object-level security checks.
Example:
public with sharing class SecureAccountController {
@AuraEnabled
public static List<Account> getSecureAccounts() {
// Enforce field- and object-level security
return [SELECT Id, Name FROM Account WHERE Industry = 'Banking' LIMIT 10];
}
}
The with sharing
keyword enforces user-specific data access.
Always validate user permissions when querying sensitive data.
7. Can @AuraEnabled
be used for private Apex methods?
No, @AuraEnabled
cannot be applied to private methods. Only public
or global
methods can use this annotation to ensure proper access control.
Incorrect Example:
public with sharing class PrivateMethodExample {
@AuraEnabled
private static String privateMethod() { // This will cause a compilation error
return 'This is not allowed';
}
}
Correct Example:
public with sharing class PublicMethodExample {
@AuraEnabled
public static String publicMethod() {
return 'This is allowed';
}
}
8. How do you handle errors in @AuraEnabled
methods in Lightning components?
Errors in @AuraEnabled
methods can be handled using try-catch
blocks in Apex and the .catch()
block on the client side. Always return meaningful error messages to users.
Example:
public with sharing class ErrorHandlingController {
@AuraEnabled
public static String processAccount(String accountId) {
try {
Account acc = [SELECT Id, Name FROM Account WHERE Id = :accountId];
return 'Account found: ' + acc.Name;
} catch (Exception e) {
throw new AuraHandledException('Error processing account: ' + e.getMessage());
}
}
}
JavaScript in LWC:
import processAccount from '@salesforce/apex/ErrorHandlingController.processAccount';
processAccount({ accountId: '001XXXXXXXXXXXX' })
.then(data => console.log(data))
.catch(error => console.error(error.body.message)); // Displays a friendly error message
9. What are the limitations of using @AuraEnabled
in Apex?
While powerful, @AuraEnabled
has some limitations:
- Methods must be
static
to be invoked by Lightning components. - Large amounts of data may lead to governor limits.
- Complex data types require serialization.
Example:
public with sharing class DataLimitExample {
@AuraEnabled
public static List<Account> getLimitedAccounts() {
// Limiting the results to avoid hitting governor limits
return [SELECT Id, Name FROM Account LIMIT 100];
}
}
Returning more than 100,000 rows in a single query can exceed limits, so always manage data efficiently.
10. Can @AuraEnabled
methods return custom objects or collections?
Yes, @AuraEnabled
methods can return custom objects or collections, as long as they are serializable.
Example:
public with sharing class CustomObjectController {
public class CustomAccount {
@AuraEnabled public String accountName;
@AuraEnabled public String accountIndustry;
public CustomAccount(String name, String industry) {
this.accountName = name;
this.accountIndustry = industry;
}
}
@AuraEnabled
public static List<CustomAccount> getCustomAccounts() {
List<Account> accounts = [SELECT Name, Industry FROM Account LIMIT 5];
List<CustomAccount> customAccounts = new List<CustomAccount>();
for (Account acc : accounts) {
customAccounts.add(new CustomAccount(acc.Name, acc.Industry));
}
return customAccounts;
}
}
JavaScript in LWC:
import getCustomAccounts from '@salesforce/apex/CustomObjectController.getCustomAccounts';
getCustomAccounts()
.then(data => console.log(data)) // Logs an array of custom objects with accountName and accountIndustry
.catch(error => console.error(error));
Start learning Salesforce online training under an experienced mentor. Enroll for a free demo.
11. How do you test @AuraEnabled
methods in Apex unit tests?
To test @AuraEnabled
methods, write standard unit test methods in Apex. Use test data and assertions to validate the method’s functionality. Ensure you cover both success and failure scenarios.
Example:
@isTest
private class AccountControllerTest {
@isTest
static void testGetAccounts() {
// Create test data
Account testAccount = new Account(Name = 'Test Account');
insert testAccount;
// Call the @AuraEnabled method
List<Account> accounts = AccountController.getAccounts();
// Assert the results
System.assert(accounts.size() > 0, 'Accounts should be returned');
}
}
Ensure all branches of the @AuraEnabled
method are covered for complete code coverage.
12. What happens if you don’t use @AuraEnabled
for a method in a Lightning component?
If you don’t annotate a method with @AuraEnabled
, the method cannot be accessed from Lightning components. You will encounter an error stating that the method is not exposed to the framework.
Incorrect Example (Without @AuraEnabled
):
public with sharing class AccountController {
public static List<Account> getAccounts() { // No @AuraEnabled annotation
return [SELECT Id, Name FROM Account LIMIT 10];
}
}
Error: “Method is not available to be called from Lightning components.”
Correct Example (With @AuraEnabled
):
@AuraEnabled
public static List<Account> getAccounts() {
return [SELECT Id, Name FROM Account LIMIT 10];
}
13. Can @AuraEnabled
methods be called directly from Visualforce pages?
No, @AuraEnabled
methods are specifically designed for Lightning components (Aura or LWC) and cannot be called directly from Visualforce pages. For Visualforce, you use @RemoteAction
instead.
Example for Visualforce:
public with sharing class VisualforceController {
@RemoteAction
public static String getAccountName(String accountId) {
Account acc = [SELECT Name FROM Account WHERE Id = :accountId LIMIT 1];
return acc.Name;
}
}
Use @AuraEnabled
for Lightning components and @RemoteAction
for Visualforce.
14. Is there a performance impact when using @AuraEnabled
methods frequently?
Excessive use of @AuraEnabled
methods can impact performance, especially when returning large datasets or making multiple server calls. Optimize by reducing the amount of data returned and using efficient SOQL queries.
Example:
@AuraEnabled
public static List<Account> getPaginatedAccounts(Integer limit, Integer offset) {
// Use LIMIT and OFFSET for pagination
return [SELECT Id, Name FROM Account LIMIT :limit OFFSET :offset];
}
Best Practice:
Use pagination or filter data to avoid large payloads.
Combine multiple operations into a single server call when possible.
15. How do you pass parameters to an @AuraEnabled
method from a Lightning component?
You can pass parameters to @AuraEnabled
methods directly from Aura or LWC. Ensure the method accepts parameters and validates them appropriately.
Example in Apex:
@AuraEnabled
public static List<Contact> getContactsByAccountId(String accountId) {
return [SELECT Id, Name FROM Contact WHERE AccountId = :accountId];
}
Example in Aura:
var action = component.get("c.getContactsByAccountId");
action.setParams({ accountId: '001XXXXXXXXXXXX' });
action.setCallback(this, function(response) {
console.log(response.getReturnValue());
});
$A.enqueueAction(action);
Example in LWC:
import getContactsByAccountId from '@salesforce/apex/AccountController.getContactsByAccountId';
getContactsByAccountId({ accountId: '001XXXXXXXXXXXX' })
.then(data => console.log(data))
.catch(error => console.error(error));
Parameters can be passed as key-value pairs, making it easy to interact with server-side logic.
Start learning Salesforce online training under an experienced mentor. Enroll for a free demo.
Conclusion
The @AuraEnabled annotation is a game-changer in Salesforce development, acting as the bridge that connects server-side logic with client-side frameworks like Aura components and Lightning Web Components (LWCs). Its ability to streamline communication ensures seamless data exchange and empowers developers to build dynamic, responsive, and user-friendly applications. Leveraging @AuraEnabled effectively not only optimizes application performance but also unlocks the full potential of the Lightning Platform.
For developers aiming to excel in the Salesforce ecosystem, mastering the @AuraEnabled annotation is non-negotiable. It sets the foundation for creating robust, scalable solutions that meet modern business needs. By understanding its capabilities and implementing it strategically, you can deliver applications that stand out in functionality and user experience, keeping you ahead in a competitive and evolving technological landscape.