Am using FinancialForce's MetadataService Class to retrieve picklist values by record type ,which works properly in a Remotingmethod.

When i try to do the same in lightning component's AuraEnabled method i get below error in the debug log.

Web service callout failed: WebService returned a SOAP Fault: INVALID_SESSION_ID: This session is not valid for use with the API faultcode=sf:INVALID_SESSION_ID faultactor

Here's the code:


public class PickListController{  

public static String getPickListByRecordTypes(String recTypeStr,String fieldStr,String objectName){

    List<String> recType = recTypeStr.split(',');
    List<String> fieldList = fieldStr.split(',');
    Map<String, Map<String, List<SelectOptionWrapper>>> returnRecordTypeAndFieldNameAndPickValSetMapMap = new Map<String, Map<String, List<SelectOptionWrapper>>>();
    Set<String> fieldSet =  new Set<String>(fieldList);

    if(recType != Null && recType.size() > 0) {
        MetadataService.MetadataPort service = createService();
        System.debug(':::recType:::' + recType + '   ' + recType.size());

        for(String rt : recType) {
            Map<String, List<SelectOptionWrapper>> fieldNameAndPickValMap = new Map<String, List<SelectOptionWrapper >>();
            System.debug(':::rt:::' + rt);

            MetadataService.RecordType recordType = (MetadataService.RecordType) service.readMetadata(
                'RecordType', new String[] { objectName +'.'+ rt }
            System.debug(':::recordType:::' + recordType);

            if(recordType.picklistValues != NULL) {
                for ( MetadataService.RecordTypePicklistValue rpk : recordType.picklistValues ) {
                    System.debug(':::rpk:::' + rpk );
                    if(rpk.picklist != NULL) {

                        if ( fieldSet.contains(rpk.picklist) ) {
                            for (MetadataService.PicklistValue pk : rpk.values ) {
                                if(pk.fullName != NULL) {  
                                    String pickVal = EncodingUtil.urlDecode(pk.fullName, 'UTF-8');
                                    if(!fieldNameAndPickValMap.containsKey(rpk.picklist)) {
                                        List<SelectOptionWrapper> optionList = new  List<SelectOptionWrapper>();
                                        optionList.add(new SelectOptionWrapper('','-None-'));
                                        optionList.add(new SelectOptionWrapper(pickVal,pickVal));
                                    } else {
                                        fieldNameAndPickValMap.get(rpk.picklist).add(new SelectOptionWrapper(pickVal,pickVal));
                        System.debug(':::fieldNameAndPickValMap:::' + fieldNameAndPickValMap);
            if(fieldNameAndPickValMap.size() > 0) {
                returnRecordTypeAndFieldNameAndPickValSetMapMap.put(rt, fieldNameAndPickValMap);
            System.debug(':::returnRecordTypeAndFieldNameAndPickValSetMapMap:::' + returnRecordTypeAndFieldNameAndPickValSetMapMap);
    return JSON.serialize(returnRecordTypeAndFieldNameAndPickValSetMapMap);

public class SelectOptionWrapper{
    public String label;
    public String value;

    public SelectOptionWrapper(String value,String label){
        this.label = label;
        this.value = value;


public static MetadataService.MetadataPort createService() {
    MetadataService.MetadataPort service = new MetadataService.MetadataPort();
    service.SessionHeader = new MetadataService.SessionHeader_element();
    service.SessionHeader.sessionId = UserInfo.getSessionId();
    return service;


<aura:component controller="PickListController">
   <aura:handler name="init" value="{!this}" action="{!c.getPickValue}"/>


getPickValue : function(component, event, helper) {
    var action = component.get("c.getPickListByRecordTypes");
        var state = response.getState();
        var result = response.getReturnValue();
        if(state === 'SUCCESS'){


FYI,When I use getPickListByRecordTypes as RemoteAction instead ,and use it in VF page,am getting the picklist values

  • I recently ran into a problem using the MetadataService from lightning, maybe there is something useful over there. salesforce.stackexchange.com/questions/110515/… – Jose Feb 27 '16 at 3:26
  • @Praveen is MetadataService class is default class or created by you? – Roster Jul 3 '18 at 5:46
  • @Roster Nope, it is part of the Apex wrapper for Metadata API which can be found here – Praveen Jul 5 '18 at 17:10

Here is the answer and you are not going to like it Lightning: is direct API access on the roadmap?

With that said:

  • are you building component(s) that need to run inside Lightning Experience (LEX) or S1 or a standalone app or Visualforce/Communities?

  • if you are using Lightning Components for Visualforce then you are not subject to the CSP rules and you also have access to a full API sessionID

  • if you have to run inside of LEX/S1 there is a not too difficult client side proxy using a hidden iframe and a small VF page "shim" that also works

FWIW I've become a much bigger fan of the inversion (use Lightning components inside of a Visualforce page as the container) in the past few months.

| improve this answer | |
  • Doug,I want this component to run inside LEX/SF1, i didn't get the iframe stuff you mentioned above.Can you please provide some links which can be really helpful for me? – Praveen Jan 16 '16 at 13:55
  • Doug, are you referring this as a possible workaround to get the picklist values? – Praveen Jan 16 '16 at 14:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.