2

I've been getting this error for some time now and I can't figure it out.

Uncaught Action failed: c:AccordianComponent$controller$doInit [Cannot read properties of null (reading 'Administration & Finance & Controlling Dept.')] Callback failed: apex://CodEsperApexCtrl/ACTION$getSettori

Can anyone help me figure out why this error is appearing?

({
    doInit : function(component, event, helper) {
        var action= component.get("c.getSettori");
        var action2=component.get("c.getSecondSet");
        var action3=component.get("c.getThirdSet");
        var action4=component.get("c.PopolaCheckFigli");
        var action5=component.get("c.PopolaCheckNipoti");
        var action6= component.get("c.PopolaMappaIniziale");
        var recordId=component.get("v.recordId");
        
        // Add callback behavior for when response is received
        action.setCallback(this, function(response) {
            var state = response.getState();
            if (component.isValid() && state === "SUCCESS") {
                component.set("v.ListSet", response.getReturnValue());
            }
            else {
                console.log("Failed with state: " + state);
            }
        });
        
        action2.setCallback(this, function(response) {
            var state2 = response.getState();
            if (component.isValid() && state2 === "SUCCESS") {
                component.set("v.MappaNonniFigli", response.getReturnValue());
            }
            else {
                console.log("Failed with state: " + state2);
            }
        });
        
        action3.setCallback(this, function(response) {
            var state3 = response.getState();
            if (component.isValid() && state3 === "SUCCESS") {
                component.set("v.MappaFigliNipoti", response.getReturnValue());
            }
            else {
                console.log("Failed with state: " + state3);
            }
        });
        
        action4.setParams({
            "AccId" : recordId
        });
        action4.setCallback(this, function(response) {
            var state4 = response.getState();
            var recordId=component.get("v.recordId");
            if (component.isValid() && state4 === "SUCCESS") {
                component.set("v.SettoreUno_Salvato", response.getReturnValue());
                console.log("SettoreUno_Salvato: " + JSON.stringify(response.getReturnValue()));
            } else {
                console.log("Failed with state: " + state4);
            }
            component.set("v.view",response.getReturnValue());
        });
        
        action5.setParams({
            "AccId" : recordId
        });
        action5.setCallback(this, function(response) {
            var state5 = response.getState();
            var recordId=component.get("v.recordId");
            if (component.isValid() && state5 === "SUCCESS") {
                component.set("v.SettoreDue_Salvato", response.getReturnValue());
            }
            else {
                console.log("Failed with state: " + state5);
            }
        });
        
        action6.setParams({
            "AccId" : recordId
        });
        action6.setCallback(this, function(response) {
            var state6 = response.getState();
            var recordId=component.get("v.recordId");
            if (component.isValid() && state6 === "SUCCESS") {
                component.set("v.MappaPerTracciareSelezioni", response.getReturnValue());
                console.log("DAti gia Salvati Tirati su da Database: " + JSON.stringify(response.getReturnValue()));
            } else {
                console.log("Failed with state: " + state6);
            }
            helper.hideMethod(component);
        });
        $A.enqueueAction(action6);
        $A.enqueueAction(action5);
        $A.enqueueAction(action4);
        $A.enqueueAction(action3);
        $A.enqueueAction(action2);
        $A.enqueueAction(action);
    },
    
    saveField : function(component, event, helper) {
        var action= component.get("c.saveSett");
        var elementId =component.get("v.recordId");
        var MyMap =JSON.stringify(component.get("v.MappaPerTracciareSelezioni"));   
        action.setParams({
            "MyMap" : MyMap,
            "AccId" : elementId
        });
        action.setCallback(this, function(response) {
            helper.showMethod(component);
            var state = response.getState();
            if (component.isValid() && state === "SUCCESS") {
                console.log("SUCCESSO!!!: " + state);
                var toastEvent = $A.get("e.force:showToast");
                toastEvent.setParams({
                    "title": "Success!",
                    "message": "The record has been updated successfully."
                });
                toastEvent.fire();   
            } else {
                console.log("Failed with state: " + state);  
            }
            helper.hideMethod(component);
        });
        $A.enqueueAction(action);
    },
    
    AggiungiValSel : function(component, event, helper) {
        var mappaSelezioni1=component.get("v.MappaPerTracciareSelezioni");
        var NuovoFiglio = event.getParam("key");
        var NuovoNipote = event.getParam("valore");
 
        //mappaSelezioni1[NuovoFiglio]=NuovoNipote;
        var mylist = [];
        for(var key in mappaSelezioni1){
            if(key == NuovoFiglio){
                console.log("Ok");
                for(var i=0;i < mappaSelezioni1[key].length; i++){
                    var c = mappaSelezioni1[key][i];
                    console.log("In For 2: "+c);
                    mylist.push(c);
                }
            }
        }
        
        mylist.push(NuovoNipote);
        mappaSelezioni1[NuovoFiglio] = mylist;
        component.set("v.MappaPerTracciareSelezioni",mappaSelezioni1);
        console.log('MappaPerTracciareSelezioni',JSON.stringify(mappaSelezioni1));
    },   
    
    AggiungiPadre : function(component, event, helper) { ;
        var mappaSelezioni1=component.get("v.MappaPerTracciareSelezioni");
        var NuovoPadre = event.getParam("key");
        var mylist = [];
        mappaSelezioni1[NuovoPadre] = mylist;
        component.set("v.MappaPerTracciareSelezioni",mappaSelezioni1);
    },
    
    TogliNipote : function(component, event, helper) { 
        var mappaSelezioni1=component.get("v.MappaPerTracciareSelezioni");
        var NipoteDaCancellare = event.getParam("valore");
        var PadreDelNipoteDaCancellare = event.getParam("key");
        for(var key in mappaSelezioni1){
            if(key == PadreDelNipoteDaCancellare){
                for(var i=0;i < mappaSelezioni1[key].length; i++){
                    var c = mappaSelezioni1[key][i];
                    if(NipoteDaCancellare==c) {
                       mappaSelezioni1[key].splice(i,1);
                    }            
                }
            }
        }
        component.set("v.MappaPerTracciareSelezioni",mappaSelezioni1);
    },
    
    TogliPadre : function(component, event, helper) { 
        var mappaSelezioni1=component.get("v.MappaPerTracciareSelezioni");
        var PadreDaCancellare = event.getParam("key");
        for(var key in mappaSelezioni1){
            if(key == PadreDaCancellare){
                delete  mappaSelezioni1[key];
            }                                         }
            component.set("v.MappaPerTracciareSelezioni",mappaSelezioni1);
        }
    }
)

component

<aura:component controller="CandidatoSettoriApexCtrl" implements="flexipage:availableForAllPageTypes,force:hasRecordId">
    <aura:handler name="init" action="{!c.doInit}" value="{!this}"/>
    
    <aura:attribute name="recordId" type="String"/>
    
    <aura:handler event="c:AggiungiPadre" action="{!c.AggiungiPadre}"/>
    <aura:handler event="c:SettoriEvent" action="{!c.AggiungiValSel}"/>
    
    <aura:handler event="c:TogliNipoti" action="{!c.TogliNipote}"/>
    <aura:handler event="c:TogliPadre" action="{!c.TogliPadre}"/>
    
    <aura:attribute name="SettoreUno_Salvato" type="String"/>
    <aura:attribute name="SettoreDue_Salvato" type="String"/>
    
    <aura:attribute name="ListSet" type="String[]"/>
    <aura:attribute name="MappaNonniFigli" type="map"/>
    <aura:attribute name="MappaFigliNipoti" type="map"/>
   

     <aura:attribute name="MappaPerTracciareSelezioni" type="Map" default="{}"/>
    <aura:attribute name="StringaPerTracciareSelezioni" type="String[]" />    
    
    <lightning:accordion activeSectionName="B">
        <aura:iteration items="{!v.ListSet}" var="Nonno">
            <c:AccordianComponent Mylabel="{!Nonno}" MappaNonniFigli="{!v.MappaNonniFigli}" MappaFigliNipoti="{!v.MappaFigliNipoti}"
                                  MappaPerTracciareSelezioni="{!v.MappaPerTracciareSelezioni}" SettoreUno_Salvato="{!v.SettoreUno_Salvato}" SettoreDue_Salvato="{!v.SettoreDue_Salvato}"  />
        </aura:iteration>
    </lightning:accordion>

    <ui:button label="Save Sectors" press="{!c.saveField}"/>
</aura:component>

classe Apex

public class CandidatoSettoriApexCtrl {
    
    @AuraEnabled
    public static List<string> getSettori() {
        
        List<string> Settori = new List<string>();
        set<string> sett = new set<string>();
        For(Settore__c s: Settore__c.getall().values()){
            sett.add(s.First_Set__c);
        }
        for(string s:sett){
            Settori.add(s);
        }
        
        Settori.sort();
        system.debug('sett: '+Settori);
        
        
        return Settori;
    }
    
    @AuraEnabled
    public static Map<string, list<string>> getSecondSet() {
        
        map<String, list<string>> m1= new  map<String, list<string>>();
        
        For(Settore__c s: Settore__c.getall().values()){
            if(m1.get(s.First_Set__c) == null)
                m1.put(s.First_Set__c,new list<string>());
            set<string> st=new set<string>(m1.get(s.First_Set__c));
            if(!st.contains(s.Second_Set__c))
                m1.get(s.First_Set__c).add(s.Second_Set__c);
        }
        
        system.debug('Mappa: '+m1);
        
        return m1;       
        
    }
    
    @AuraEnabled
    public static Map<string, list<string>> getThirdSet(){
        
        map<String, list<string>> m2= new  map<String, list<string>>();
        
        For(Settore__c s: Settore__c.getall().values()){
            if(m2.get(s.Second_Set__c) == null)
                m2.put(s.Second_Set__c,new list<string>());
            m2.get(s.Second_Set__c).add(s.Third_Set__c);
        }
        
        return m2;
        
    }
    
     @AuraEnabled
    public static void  saveSett (string MyMap, String AccId){

        // Map<String, Object> MappaSelezioni = (Map<String, Object>)JSON.deserializeUntyped(MyMap);
        Map<String, List<String>> MappaSelezioni = (Map<String,List<String>>) JSON.deserialize(MyMaP, Map<String,List<String>>.class);
        
        String Nipoti = '';
        String Padri='';
        String Nonni='';
        Set<String> NonniSenzaDoppioni=new Set<String>();
        
        For(String s :MappaSelezioni.keySet()){
            Padri += s+';';
            For(string l: MappaSelezioni.get(s)){
               Nipoti += l + ';';
            }
        }
        system.debug('****Nipoti: '+Nipoti);
        List <contact> contatti= new List<contact>([SELECT id,Macro_Settore__c, SottoSettore1__c, Sottosettore2__c from Contact where id =: AccId Limit 1]);
        if(contatti!=null && contatti.size()>0){
            List<Settore__c> MacroSettori=new List<Settore__c>([SELECT First_Set__c from Settore__c where Second_Set__c =:MappaSelezioni.keySet()]);
            
            For(Settore__c n : MacroSettori){ NonniSenzaDoppioni.add(n.First_Set__c);}
            For(String m : NonniSenzaDoppioni){ Nonni += m + ';'; }
            
            For(contact a:contatti){
                a.Sottosettore1__c = Padri;
                a.Sottosettore2__c = Nipoti;
                a.Macro_Settore__c = Nonni;
                update a;}
        }
        
         List <candidato__c> candidati= new List<candidato__c>([SELECT id,Macro_Categoria_Settore__c, Categoria_Settore__c, Sottocategoria_Settore__c from candidato__c where id =: AccId Limit 1]);
        if(candidati!=null && candidati.size()>0){
            List<Settore__c> MacroSettori=new List<Settore__c>([SELECT First_Set__c from Settore__c where Second_Set__c =:MappaSelezioni.keySet()]);
            
            For(Settore__c n : MacroSettori){ NonniSenzaDoppioni.add(n.First_Set__c);}
            For(String m : NonniSenzaDoppioni){ Nonni += m + ';'; }
            
            For(candidato__c a:candidati){
                a.Categoria_Settore__c = Padri;
                a.Sottocategoria_Settore__c = Nipoti;
                a.Macro_Categoria_Settore__c = Nonni;
                update a;}
        }
        }
    
    @AuraEnabled
    public static Map<String,String> AggiornaListaSelezionata (String mappaStringataFigliNipoti){
        String stringaFigliNipoti='';
        Map<String,String> mappaSelezioni=new Map<String,String>();
        
        return mappaSelezioni;
    }
    
    //AGGIUNTA
    @AuraEnabled
    public static List<String>  PopolaCheckFigli (String CandidatoID){
        
        Set<String> SetConSelezioni=new Set<String>();
        Set<String> SetConSelezioniNipoti=new Set<String>();
        List<String> ListaConSelezioni=new List<String>();
        List<String> ListaConSelezioniNipoti=new List<String>();
        
        List<Contact> ContactGiaMemorizzato= new List<Contact>([SELECT SottoSettore1__c from Contact where id =: CandidatoID]);
        List<Candidato__c> CandidatoGiaMemorizzato= new List<Candidato__c>([SELECT Categoria_Settore__c from Candidato__c where id =: CandidatoID]); 
        
        For(Candidato__c a : CandidatoGiaMemorizzato){
            SetConSelezioni.add(a.Categoria_Settore__c);
        }
        
        For(Contact a : ContactGiaMemorizzato){
            SetConSelezioni.add(a.SottoSettore1__c);
        }
        system.debug('SetConSelezioni  '+SetConSelezioni);
        
        For(String s : SetConSelezioni){
            ListaConSelezioni.add(s);
        }
        
        return ListaConSelezioni;
        
    }
    
    @AuraEnabled
    public static List<String>  PopolaCheckNipoti (String CandidatoID){
        Set<String> SetConSelezioniNipoti=new Set<String>();
        List<String> ListaConSelezioniNipoti=new List<String>();
        
        List<Contact> ContactGiaMemorizzato= new List<Contact>([SELECT SottoSettore2__c from Contact where id =: CandidatoID]);
        List<Candidato__c> CandidatoGiaMemorizzato= new List<Candidato__c>([SELECT Sottocategoria_Settore__c from Candidato__c where id =: CandidatoID]);
       
        
        For(Contact a : ContactGiaMemorizzato){
            SetConSelezioniNipoti.add(a.SottoSettore2__c);
        }
        
        For(Candidato__c a : CandidatoGiaMemorizzato){
            SetConSelezioniNipoti.add(a.Sottocategoria_Settore__c);
        }
        system.debug('SetConSelezioni  '+SetConSelezioniNipoti);
       
        For(String s : SetConSelezioniNipoti){
            ListaConSelezioniNipoti.add(s);
        }
        
        return ListaConSelezioniNipoti;
        
    }
    
    @AuraEnabled
    public static Map<String, List<String>>  PopolaMappaIniziale (String AccId){
         Map<String, List<String>> MappaDatiSalvati=new Map<String, List<String>>();
        List<String> NipotiSave= new List<String>();
        List<String> FigliSave= new List<String>();
        List<String> NipotiSaveList= new List<String>();
        
        List<Contact> ContactGiaMemorizzato= new List<Contact>();
        ContactGiaMemorizzato=[SELECT SottoSettore1__c, SottoSettore2__c from Contact where id =: AccId];
        if(ContactGiaMemorizzato!=null && ContactGiaMemorizzato.size()>0){
            for(Contact a:ContactGiaMemorizzato){
        FigliSave=(a.SottoSettore1__c).split(';');
                NipotiSave=(a.SottoSettore2__c).split(';');}}
        
        List<Candidato__c> CandidatoGiaMemorizzato= new List<Candidato__c>();
        CandidatoGiaMemorizzato=[SELECT Categoria_Settore__c, Sottocategoria_Settore__c from Candidato__c where id =: AccId];
        if(CandidatoGiaMemorizzato!=null && CandidatoGiaMemorizzato.size()>0){
            for(Candidato__c a:CandidatoGiaMemorizzato){
        FigliSave=(a.Categoria_Settore__c).split(';');
                NipotiSave=(a.Sottocategoria_Settore__c).split(';');}}
        
  
         map<String, list<string>> m2= new  map<String, list<string>>();
        
        For(Settore__c s: Settore__c.getall().values()){
            if(m2.get(s.Second_Set__c) == null)
                m2.put(s.Second_Set__c,new list<string>());
            m2.get(s.Second_Set__c).add(s.Third_Set__c);
        }
        
        for(String s: FigliSave){
            for(String s2 : NipotiSave){
                if((m2.get(s)).contains(s2)){
                   NipotiSaveList.add(s2);
                }
            }
            MappaDatiSalvati.put(s,NipotiSaveList);
        }
            
       
        system.debug(' Mappa Dati Salvati: '+MappaDatiSalvati);
        return MappaDatiSalvati;
        
    }
}
3
  • 1
    We don't have the appropriate code to help you. I can tell it's almost certainly because of v.ListSet is triggering a two-way data binding with something that is trying to read a value from a null object. We would need to see the component markup related to this attribute (the attribute definition and any components bound to it) to determine the actual error. You can also try debugging this in the F12 browser debugger using the "Pause on exceptions" and "Pause on caught exceptions" options enabled in the Sources tab.
    – sfdcfox
    Dec 12, 2022 at 14:16
  • Hi, thanks for the reply, unfortunately I'm not a developer but I find myself dealing with this error and trying to fix it. I modified the question with the component code and related apex class.
    – FRANCI
    Dec 12, 2022 at 15:00
  • The actual problem is deeper down, but you can fix it easily with just a few lines of code changes.
    – sfdcfox
    Dec 12, 2022 at 15:25

1 Answer 1

1

The problem is that c:AccordianComponent is not properly checking that the attributes are not null before attempting to access the values. Without seeing that component's code, it's hard to tell which one is the problem, but the easy fix is to default the attributes to a default value:

<aura:attribute name="MappaNonniFigli" type="Map" default="{}" />
<aura:attribute name="MappaFigliNipoti" type="Map" default="{}" />

Note that map and Map are different things in JavaScript, as it is case-sensitive. While both technically work, it is recommended by the documentation to use proper capitalization for all data types (e.g. Boolean instead of boolean).

1
  • I modified the code as you told me, but unfortunately the error continues to occur, not always, but sometimes yes and sometimes no. Is there anything else I can do to fix?
    – FRANCI
    Dec 13, 2022 at 8:31

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .