IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Salesforce.com Discussion :

[APEX] System.NullPointerException: Attempt to de-reference a null object


Sujet :

Salesforce.com

  1. #1
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut [APEX] System.NullPointerException: Attempt to de-reference a null object
    Bonjour,

    M'inspirant d'un code existant (je suis admin et je débute en développement), je souhaite ajouter un bouton à la page Compte pour créer une nouvelle opportunité liée à ce compte.

    Le code semble fonctionner mais il génère un message d'erreur lorsque je teste la classe System.NullPointerException: Attempt to de-reference a null object.
    L'erreur se situe à la ligne vf.init() de la méthode de test.

    Avez-vous une idée de ce qui pose problème?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public with sharing class New_Opportunity_On_Account
    {
      private string AccountId;
      
      public New_Opportunity_On_Account ()
      {
        AccountId = ApexPages.currentPage().getParameters().get('id');
      }
      
      public Pagereference init()
      {        
          
        PageReference p = new PageReference(Constants.RECORD_TYPE_URL);
        p.getParameters().put('ent','Opportunity');
        p.getParameters().put(constants.RET_URL,'/'+AccountId); 
        string save_Url = Constants.OPPORTUNITY_EDIT_URL + '?nooverride=1&';
        
        save_Url +=  constants.ACCOUNT_ID_FIELD_ID + '=' + AccountId  + '&' +
            constants.RET_URL + '=' + '/'+AccountId;
        
        p.getParameters().put(Constants.SAVE_NEW_URL,save_Url);
        
        return p;
      }
      
      /************************************TEST************************************/
      public static testMethod void test()
      {
        Account acc = New Account();
        acc.Name= ... quelques données renseignées
        insert acc;
        PageReference p  = Page.New_Opportunity_On_Account;
        p.getParameters().put('id',acc.id);
        Test.setCurrentPageReference(p);
        New_Opportunity_On_Account vf = new New_Opportunity_On_Account();
        vf.init();
      }
    
    }
    La page Visualforce est rudimentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <apex:page controller="New_Opportunity_On_Account" action="{!init}">
    
    </apex:page>

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    je dirais d'instinct que ApexPages.currentPage() retourne NULL dans le constructeur de New_Opportunity_On_Account

    En regardant mon code, j'ai utilisé :
    System.currentPageReference().getParameters().get('Id');
    pour récupérer les paramètres

    Fais l'essai en le remplaçant dans le constructeur et le test, peut être que la class ApexPages ne fonctionne que dans le context Salesforce et pas en tests

    Remarque: j'aime pas trop la methodtest écrite, le fait de créer la page va aussi créer le controlleur que tu crée à nouveau ... c'est douteux, mais le problème ne vient pas forcément de là

  3. #3
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Citation Envoyé par v.charlet Voir le message
    je dirais d'instinct que ApexPages.currentPage() retourne NULL dans le constructeur de New_Opportunity_On_Account

    En regardant mon code, j'ai utilisé :
    System.currentPageReference().getParameters().get('Id');
    pour récupérer les paramètres

    Fais l'essai en le remplaçant dans le constructeur et le test, peut être que la class ApexPages ne fonctionne que dans le context Salesforce et pas en tests

    Remarque: j'aime pas trop la methodtest écrite, le fait de créer la page va aussi créer le controlleur que tu crée à nouveau ... c'est douteux, mais le problème ne vient pas forcément de là
    Bonjour

    Merci Vincent pour ton conseil.

    Je viens de tester rapidement en changeant dans le constructeur mais cela ne règle pas le problème.

    Je ne vois pas comment je pourrai l'appliquer dans la fonction de test comme tu le suggères et suis partant pour revoir la structure de la fonction test mais ... je n'ai pas encore les compétences

    Ce qui m'intrigue c'est que je me suis inspiré d'un autre code qui lui ne génère pas de message d'erreur. J'en déduis que j'ai - comme souvent - le problème sous les yeux sans m'en rendre compte

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    le code fonctionne mais pas le test c'est bien ça ?

    peut être voir du coté de Test.setcurrentPage(pageReference page) ??
    http://www.salesforce.com/us/develop...inName=webhelp

    il y a la dernière réponse de ce thread qui donne un exemple plutôt clair d'une procédure de test :
    http://boards.developerforce.com/t5/...ss/td-p/136418

  5. #5
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Bonjour,

    C'est quelque chose que tu as envie de faire ?
    Car la liaison existe déjà pour créer une opportunité rattaché au compte.

  6. #6
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Citation Envoyé par Overcrash Voir le message
    Bonjour,

    C'est quelque chose que tu as envie de faire ?
    Car la liaison existe déjà pour créer une opportunité rattaché au compte.
    Bonjour,

    Je n'ai pas repéré cette possibilité, à part via la liste associée d'opportunités que je ne peux utiliser dans notre cas (en raison d'autres personnalisations).

    Il y a un autre endroit?j'ai raté quelque chose ???

    Ceci dit, j'ai de toute façon une commande similaire à mettre en place pour la création d'un objet personnalisé lié au compte.

  7. #7
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonjour,

    Pour information, j'ai un peu avancé: en tâtonnant, il semble que le problème vienne de l'étape intermédiaire de sélection de type d'enregistrement.
    J'ai revu le code comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public Pagereference init()
      {        
        string save_url ='/006/e?nooverride=1&opp4_lkid=001R000000iv3fc +'&' +
                        constants.CLOSED_DATE_FIELD_ID +'='
                            +constants.CLOSED_DATE +'&'+constants.RET_URL +'=/'+AccountId;  
        PageReference p = new PageReference(save_url);
    return p;
    et je n'ai plus d'erreur.
    Ceci dit, je ne trouve pas cela très clean et je ne comprends pas pourquoi le code précédent pose problème alors qu'il fonctionne sans souci dans une autre classe.

  8. #8
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Je regarde demain je te fais un retour.

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    Par défaut
    Bonjour,

    Il y a un moyen très simple de faire ça sans aucun code, il suffit de mettre le lien suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /006/e?accid={!Account.Id}&opp3={!Account.Name}
    sinon une méthode encore plus simple est d'utiliser le bouton nouvelle opportunité sur la liste associée opportunité affichée sur le compte.

  10. #10
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Citation Envoyé par tomasi Voir le message
    Bonjour,

    Il y a un moyen très simple de faire ça sans aucun code, il suffit de mettre le lien suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /006/e?accid={!Account.Id}&opp3={!Account.Name}
    sinon une méthode encore plus simple est d'utiliser le bouton nouvelle opportunité sur la liste associée opportunité affichée sur le compte.
    Bonsoir tomasi,

    Désolé pour ma réponse tardive.
    J'ai essayé ce que tu proposes. Une opportunité est bien créée mais le champ Account n'est pas alimenté... Je suis occupé par autre chose en ce moment et je n'ai pas cherché en détail ce qui ne va pas...

    Le bouton dans la liste associée n'est pas applicable dans mon cas car nous n'affichons pas cette liste pour d'autres raisons (gestion de droits non standard...).

    Je reviendrai dans cette discussion lorsque je me replongerai dans ce bout de code et - j'espère - que je trouverai enfin où est le problème.

    Merci à tous.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2014, 09h43
  2. Réponses: 6
    Dernier message: 29/11/2010, 16h09
  3. Null object reference
    Par elisfr dans le forum Débuter avec Java
    Réponses: 13
    Dernier message: 11/10/2008, 21h01
  4. Réponses: 1
    Dernier message: 24/08/2008, 14h08
  5. [C#][.net2] NULL Object reference lors de l'accès à un DGV
    Par VincenzoR dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2006, 02h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo