2017-07-26 2 views
0

J'ai une classe Salesforce Apex qui améliore les fonctionnalités d'un bouton personnalisé. Je souhaite fournir des paires clé/valeur de retour avec des informations pour le frontal.Apex - Type de retour incorrect Map <String, EmbeddedClass>

Ce que je suis aux prises avec est de pouvoir obtenir cette nouvelle classe à enregistrer. L'erreur que je reçois est:

Invalid return type: Map<String,ButtonCaseHandler.ResponseWrapper> at line 37 column 51

J'ai vérifié que toutes les valeurs que je suis de passage dans la ResponseWrapper.value est une liste de chaînes. À ce stade, je ne sais pas trop où aller avec ça.

global class ButtonCaseHandler { 

private static final String defaultNewCaseRecordType = 'ID1'; 

private static List<String> getGhsOpenCases(String memberId, String dependentId){ 
    List<String> result = new List<String>(); 
    try{ 
     //1. check all GHS open cases for this member within the last 14 days 
     List<Case> openCases = [ 
      SELECT Id, casenumber,super_diagnosis__c, CreatedDate 
       FROM Case 
      WHERE recordTypeId IN ('ID1','ID2') 
       AND createdDate >= LAST_N_DAYS:14 
       AND status = 'Open' 
       AND Account.member_id__c = :memberId 
       AND (Account.dependent_id__c = :dependentId OR Account.dependent_id__c = null) 
      ORDER BY CreatedDate ASC 
     ]; 

     for(Case c : openCases){ 
      result.add('Case, '+c.casenumber+', has a super diagnosis of '+ c.super_diagnosis__c + 'and was created on '+ c.createdDate.format('dd-MMM-yyyy')); 
     } 
    } 
    catch(Exception e){ 
    } 

    return result; 
} 

webService static Map<String,ResponseWrapper> AccountCreateCase(Id aId){ 
    Map<String, ResponseWrapper> result = new Map<String,ResponseWrapper>(); 
    try{ 
     Account currentAccount = [ 
            SELECT Id, Viewing_User_Profile_Name__c, member_id__c, 
              Policy__c, Name, dependent_id__c 
             FROM Account 
            WHERE Id = :aId 
            LIMIT 1 
           ];   

     //create the mapping between profile names and case record types 
     Map<String,String> profileNameToReRecordTypeId = new Map<String,String>(); 
     profileNameToReRecordTypeId.put('RCNAME1','ID1');         
     profileNameToReRecordTypeId.put('RCNAME2','ID2'); 
     profileNameToReRecordTypeId.put('System Administrator','ID1'); 

     String caseRecordType = profileNameToReRecordTypeId.get(currentAccount.Viewing_User_Profile_Name__c); 

     if(String.isBlank(caseRecordType)){ 
      caseRecordType = defaultNewCaseRecordType; 
     } 

     ///validation if it's a GHS profile 
     if(currentAccount.Viewing_User_Profile_Name__c == 'RCNAME1'){ 
      List<String> ghsOpenCasesString = ButtonCaseHandler.getGhsOpenCases(currentAccount.member_id__c,currentAccount.dependent_id__c); 

      if(!ghsOpenCasesString.isEmpty()){ 
       ResponseWrapper oc = new ResponseWrapper(); 
       oc.value = ghsOpenCasesString; 
       result.put('openCases',oc); 
       ResponseWrapper ic = new ResponseWrapper(); 
       ic.value = new List<String>{'true'};      
       result.put('invokeConfirm',ic); 
      } 
     } 

     //create the URL hack for the time being. 
     ///we will want to update this later on to create the case and relocate to the newly created case 
     String relocateUrl = '/500/e?RecordType=URLTORELOCATETHEUSERTO'; 

     ResponseWrapper ru = new ResponseWrapper(); 
     ru.value = new List<String>{relocateUrl}; 
     result.put('relocateUrl',ru); 


    } 
    catch(Exception e){ 
     System.debug('Error in AccountCreateCase method: ' + e); 
     //instantiate the error long class 
     ErrorLog errorLog = new ErrorLog();    
     ErrorLog__c methodErr = new ErrorLog__c(
      method_name__c = 'AccountCreateCase', 
      method_source__c = 'ButtonCaseHandler', 
      stack_trace__c = e.getMessage(), 
      application_data__c = '{"accountId": '+aId+'}' 
     ); 
     errorLog.logError(methodErr, true, ''); 
    } 

    return result; 
} 

global class ResponseWrapper { 
    webService List<String> value {get; set;} 
}  

}

Merci pour toute aide.

Répondre

0

Le problème est dû au manque de prise en charge de Maps en tant que type de retour lorsque la méthode est un service Web. SOAP ne supporte pas la carte, vous devez donc convertir en une liste de listes, où vous avez une liste de clés et ensuite une liste de valeurs.

+0

Pourquoi est-ce même un WebService? Vous pouvez créer un bouton personnalisé qui lance une page Visualforce exécutant votre logique à la place. –