Déboguer dans une communauté ou un site Force.com

Aurélien Laval

Comment pouvons-nous déboguer dans une communauté ou un site Force.com lorsque les erreurs ne sont pas affichées à l'écran de l'utilisateur ?

Commentez

- Titre : Déboguer dans une communauté ou un site Force.com

- Auteur : Aurélien Laval

- Parution : 3 février 2016

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2016 Aurélien Laval. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Prérequis

- III. Fonctionnement de la page Visualforce

- III-A. Le contrôleur

- III-B. La page Visualforce

- III-C. Utilisation de la page Visualforce

- IV. Conclusion

I - Introduction

En temps normal, lorsqu'une erreur non gérée se produit sur une page Visualforce, un message contenant une description de l'erreur s'affiche à l'écran de l'utilisateur.

En revanche, si l'utilisateur se trouve dans une communauté ou un site Force.com, Salesforce.com n'affiche pas un message d'erreur, mais un message indiquant qu'une erreur s'est produite et lui demandant de contacter un administrateur :

Nous n'avons donc aucune information sur la cause de cet incident, comment pouvons-nous donc procéder pour déboguer ? Une des solutions consiste à afficher cette page Visualforce à l'intérieur de Salesforce.com et non dans la communauté/site pour que le message d'erreur puisse correctement apparaître, mais il est parfois complexe de reproduire le même scénario du bogue. Pas de panique, il existe une solution à tout cela !

En me baladant sur Internet, je suis tombé sur un article de Kevin Poorman. Ce dernier utilise une page Visualforce dans un site Force.com ou dans une communauté afin de charger le contenu de celle posant problème pour ensuite afficher le descriptif de l'erreur.

Avant d'aller plus loin dans cet article, je vous propose quelques rappels sur les termes techniques qui vont être utilisés :

- Salesforce.com est un CRM (Customer Relationship Manager) orienté SaaS (Software as a Service) et PaaS (Platform as a Service) permettant la gestion des relations clients d'une entreprise ;

- Apex est un langage de programmation côté serveur permettant de modifier la logique métier et le traitement des données ;

- Visualforce est un framework d'interface utilisateur utilisé par la plateforme Force.com. Il utilise un langage de balises au même titre que le HTML. Chacune des balises correspond à un composant de l'interface utilisateur comme une section, un champ d'un objet Salesforce ou encore une table de données.

II - Prérequis

Avant toute chose, vous devez disposer d'une instance afin de pouvoir suivre ce tutoriel. Si ce n'est pas le cas, je vous invite à vous rendre à cette adresse. Salesforce met à disposition plusieurs types d'instances qui proposent différentes fonctionnalités à différents prix (prix par licence utilisateur par mois). La seule instance que vous pourrez généreusement obtenir de la part de Salesforce est celle de développement (celle que je vous propose via le lien ci-dessus) qui, comme son nom l'indique, sert à tester et développer des services. Je vous laisse juger par vous-même la grille tarifaire sur les diverses instances que propose le CRM.

Vous aurez également besoin d'un environnement de développement pour écrire votre code, vous pouvez utiliser celui fourni par Salesforce ou alors vous procurer celui compatible avec Eclipse et qui s'appelle Force.com IDE (je l'utiliserai tout au long de ce tutoriel). Pour ce dernier, rendez-vous sur l'Eclipse MarketPlace et installez-le.

III - Fonctionnement de la page Visualforce

Comme indiqué plus haut dans l'introduction, nous allons nous servir d'une page Visualforce (accompagné de son contrôleur) pour nous aider à déboguer et voir s'afficher le message d'erreur de la page qui pose problème dans la communauté.

III-A - Le contrôleur

De façon assez simple, le contrôleur de la page Visualforce charge celle que vous souhaitez corriger pour renvoyer son contenu à la vue.

De façon un peu plus détaillée, au chargement du contrôleur, le constructeur est initialisé (comme vous pouvez vous en douter dans tout langage de développement orienté objet), récupère les paramètres envoyés via l'URL pour reconstituer celle à utiliser pour appeler la page Visualforce boguant.

Une fois la page Visualforce de débogage initialisée (contrôleur exécuté), la méthode fetchFailingPage() est appliquée depuis le contrôleur pour simuler un appel jusqu'à la page contenant l'erreur.

Voici le contrôleur en question :

1. public with sharing class CommunityDebuggerCtrl {

2. public String failingPageResponse { get; set; }

4. String toLoad {get; private set;}

5. Map<String, String> params {get; private set;}

6. String queryString = "?";

8. public CommunityDebuggerCtrl() {

9. params = ApexPages.currentPage().getParameters();

10. toLoad = (String) params.get('page');

11. params.remove('page');

13. system.debug('params' + params);

15. boolean first = true;

16. for (String key : params.keyset()) {

17. if(first){

18. queryString = queryString + key + '=' + params.get(key);

19. first = false;

20. }else{

21. queryString = queryString + '&' + key + '=' + params.get(key);

22. }

23. }

24. }

26. public void fetchFailingPage() {

27. try {

28. system.debug('Loading this url: ' + toLoad +  queryString);

29. PageReference fail = new PageReference('/apex/' + toLoad + queryString);

30. failingPageResponse = fail.getContent().toString();

31. } catch (Exception e) {

32. failingPageResponse = e.getTypeName() + ' : ' + e.getMessage() + ' : ' + e.getStackTraceString();

33. }

34. }

35. }

Petite remarque, la méthode fetchFailingPage() est appelée depuis la page Visualforce, mais elle aurait très bien pu l'être depuis le constructeur, cela fonctionne également, je n'ai simplement pas voulu modifié le code disponible dans l'article.

III-B - La page Visualforce

La page Visualforce est assez simple, elle ne contient qu'une balise apex:outputText pour afficher le contenu et le paramètre fetchFailingPage() dans la balise apex:page pour spécifier quelle méthode lancée une fois la page chargée, en l'occurrence celle qui va simuler un appel vers la page Visualforce que nous souhaitons corriger.

Voici le code de la page Visualforce :

1. <apex:page controller="CommunityDebuggerCtrl"  action="{!fetchFailingPage}" showHeader="false" sidebar="false" >

2. <apex:outputText id="failingPageResponse" escape="false" value="{!failingPageResponse}" />

3. </apex:page>

III-C - Utilisation de la page Visualforce

L'utilisation est assez simple, vous devez appeler dans votre navigateur internet la page Visualforce CommunityDebugger et y ajouter le paramètre page avec comme valeur, celle à déboguer suivie des paramètres dont elle a besoin pour correctement fonctionner en temps normal (l'identifiant d'un compte par exemple).

Supposons que la page que nous souhaitons tester se nomme ErrorCommunity et qu'elle a besoin du paramètre fakeAccountId, notre URL ressemblera donc à ceci : /apex/CommunityDebugger?page=ErrorCommunity&fakeAccountId=123456789.

Voici un exemple de message d'erreur obtenu :

Nous obtenons donc exactement le même message d'erreur que sur une page Visualforce classique, c'est bien ce qui était attendu

En revanche, que se passe-t-il si la page Visualforce ne contient pas de bogues et fonctionne correctement ?

Vous obtiendrez simplement un rendu normal :

La page Visualforce CommunityDebugger interprète donc le contenu qui lui est retourné.

IV - Conclusion

Dans cet article, vous avez appris à déboguer une erreur à l'intérieur d'une communauté ou d'un site Force.com grâce à une page Visualforce qui charge le contenu d'une autre, cela signifie soit un message d'erreur soit un contenu normal.

Bien entendu, comme cette page sert à du débogage, elle ne devrait pas être déployée en production puisqu'elle ne sert qu'à corriger des bogues et ne nécessite donc pas de classe de test.

Je conçois que ce tutoriel est assez court par la taille, mais grand par son utilité et peut vous éviter de vous arracher les cheveux de la tête si vous ne savez pas comment corriger une erreur dans une communauté ou un site Force.com.