Imparare la sintassi di Apex è relativamente semplice, specialmente se si è programmatori e sviluppatori che vengono da un background Java.
Ma sebbene Apex sia un linguaggio di programmazione java-like, vi sono aspetti in cui è molto diverso da Java, ad esempio per quanto riguarda i meccanismi di gestione del codice asincrono e i governor limits imposti dalla piattaforma Salesforce.
Dopo aver imparato le basi della programmazione in Apex è necessario quindi evitare di commettere alcuni comuni errori. In questa guida ci concentreremo in particolare sui 3 errori più frequenti per i nuovi sviluppatori Apex:
- Trigger e callout in async
- Non fare update prima di una chiamata callout
- Creare una mappa da una query
Vediamoli uno ad uno.
Non è possibile effettuare una callout da un trigger
Il primo errore a cui puoi andare incontro è quello di tentare di effettuare una callout da un trigger. Scoprirai che non è possibile chiamare servizi esterni in modo sincrono a partire da un trigger.
Per poterlo fare è necessario racchiudere il metodo di chiamata callout in un metodo future (se vuoi puoi scoprire di più su cosa sono i future method).
Non è possibile effettuare una operazione DML prima di effettuare una callout
Quando si tenta di effettuare una operazione DML prima di effettuare una callout, l’errore tipico che si ottiene è il seguente: “You have uncommitted work pending. Please commit or rollback before calling out” ed è causato da un codice di questo tipo:
update account;
HttpResponse httpresponse = HttpService.sendRequest(endPoint, jsonRequest, header, 'POST');
Questo errore avviene perché l’update potrebbe non aver effettuato il commit nel database quando viene effettuata la chiamata.
Le possibili soluzioni sono essenzialmente 2:
- Se applicabile, spostare l’operazione DML oppure la chiamata al servizio esterno in un metodo future.
- Se le due operazioni non sono strettamente correlate, effettuare l’operazione DML subito dopo la chiamata callout.
Creare una mappa a partire da una query
Quando effettuiamo una query, quello che otteniamo è una lista (List) di oggetti. Come possiamo trasformarlo in una mappa?
Qui di solito viene commesso il terzo errore di cui parleremo in questa guida. Quello che ho visto spesso è il seguente codice:
List<Account> accounts = [SELECT Id, Name FROM Account];
Map<Id, Account> accountsMap = new Map<Id, Account>();
for(Account account : accounts){
accountsMap.put(account.id, account);
}
È possibile riscrivere questo codice come segue:
Map<Id, Account> accountsMap = new Map<Id, Account>([SELECT Id, Name FROM Account]);
Ottenendo lo stesso risultato ma scrivendo un codice più pulito e coinciso.
Attenzione però: questo trucco vale soltanto quando la chiave della coppia <chiave,valore> è l’id Salesforce. Se è necessario utilizzare un’altra chiave, bisogna utilizzare per forza il for per creare una mappa a partire da una lista.
E voi, quali errori o inesattezze avete riscontrato più spesso?