2017-10-04 78 views
1

我有一個PHP站點通過Visualforce頁面調用Salesforce上的REST終端。當試圖驗證JSON響應我確認所有必填字段,但我現在收到此錯誤:嘗試解除引用空對象Salesforce Visual Force頁面

{"success":false, "message":"System.NullPointerException: Attempt to de-reference a null object 

這是從下面的Apex類來:

public class WebDirectController { 

公共類ApiException擴展異常{}

public String response {get;set;} 

private static final String PRIVATE_APPLICATION_KEY = '123'; 

public WebDirectController(){} 

public Pagereference safeAction(){ 

    Savepoint sp = Database.setSavepoint(); 

    String businessUnit; 

    try { 

     Map<String, String> params = ApexPages.currentPage().getParameters(); 

     for (String key : params.keySet()){ 
      system.debug(key +' -> '+ params.get(key)); 

     } 

     if (params.containsKey('Business_Unit__c') == false){ 
      throw new ApiException('Unauthorized!'); 
     } 

     businessUnit = params.get('Business_Unit__c'); 

     if (params.containsKey('applicationKey') == false){ 
      throw new ApiException('Unauthorized!'); 
     } 
     if (params.get('applicationKey') != PRIVATE_APPLICATION_KEY){ 
      throw new ApiException('Unauthorized!'); 
     } 

     // throws ApiException 
     validateRequiredFields(params); 


     WebDirectUtility utility = new WebDirectUtility(businessUnit); 

     utility.duplicateCheck(params); 

     if (utility.duplicateAccountList.isEmpty() == false){ 

      // if last opp is needs RX attach attachments to opp and flag opportunity 

      if (utility.duplicateAccountList.get(0).Opportunities.isEmpty() == false 
       && utility.duplicateAccountList.get(0).Opportunities.get(0).Status__c == 'Needs Rx' 
       && utility.hasAttachments(params) == true){ 

       // save attachment. 

       utility.createAttachmentList(params); 

       utility.addAttachmentParentId(utility.duplicateAccountList.get(0).Opportunities.get(0).Id); 

       insert utility.attachmentList; 

       // set status to 'Attention- Call Center' 

       Opportunity opp = utility.duplicateAccountList.get(0).Opportunities.get(0); 

       opp.Status__c = 'Attention- Call Center'; 

       update opp; 

       //utility.sendEmail(params, utility.duplicateAccountList.get(0), opp); 

       response = '{"success":true}'; 
       return null; 

      }else{ 

       //utility.sendEmail(params, utility.duplicateAccountList.get(0)); 
       response = '{"success":true}'; 
       return null; 
      } 
     } 

     utility.createAll(params); 



     insert utility.patientAccount; 

     utility.addAttachmentParentId(utility.patientAccount.Id); 
     //system.debug('attachmentList -> '+ utility.attachmentList); 
     insert utility.attachmentList; 

     utility.addOpportunityAccountId(utility.patientAccount.Id); 
     //system.debug('patientOpportunity -> '+ utility.patientOpportunity); 
     insert utility.patientOpportunity; 

     utility.addLineItemOpportunityId(utility.patientOpportunity.Id); 
     //system.debug('lineItemList -> '+ utility.lineItemList); 
     insert utility.lineItemList; 


     //send success email to kelly 
     Opportunity opp = [SELECT Opportunity_Url__c FROM Opportunity WHERE Id =:utility.patientOpportunity.Id]; 
     Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); 
    mail.setSubject(businessUnit + ' Direct Success Email'); 
    mail.setHtmlBody('<p>'+ businessUnit +' Direct created this opportunity: <a href="'+ opp.Opportunity_Url__c +'">'+ opp.Opportunity_Url__c +'</a></p>'); 
    mail.setToAddresses(new String[]{'[email protected]', '[email protected]'}); 
     Messaging.sendEmail(new Messaging.Email[] {mail}); 


     response = '{"success":true}'; 

    }catch(Exception e){ 

     ErrorEmail.sendEmail(e); 

     system.debug(e); 
     system.debug(e.getMessage()); 
     system.debug(e.getStackTraceString()); 

     response = '{"success":false, "message":"'+ e.getMessage() +'"}'; 

     Database.rollback(sp); 
    } 
    return null; 
} 


public void validateRequiredFields(Map<String, String> params){ 

    Set<String> requiredParams = new Set<String>{'FirstName', 
               'LastName', 
               'PersonBirthdate', 
               'Phone', 
               'PersonEmail', 
               'BillingStreet', 
               'BillingCity', 
               'BillingState', 
               'BillingPostalCode'}; 

    for (String rp :requiredParams){ 
     if (params.get(rp) == '' || params.get(rp) == null){ 
      throw new ApiException(rp +' is required!'); 
     } 
    } 
} 

}

不知道我很想念,但我GOI試圖找出這兩個星期。

謝謝

回答

1

我想關閉這個循環。通過將堆棧軌道添加到調試信息中,我可以在解決Apex類問題的設置中找到錯誤,工具類中的產品訂單項指向錯誤的價格手冊。

將堆棧跟蹤添加到調試信息是訣竅。

謝謝

+0

標記你自己的答案被接受,你會得到一些聲譽:) – eyescream

0

以您在PHP應用程序中使用其憑據的用戶身份登錄到SF。打開開發者控制檯(右上角,旁邊的用戶名),執行來自PHP的呼叫。理想情況下,您會看到使用更詳細的錯誤消息生成的調試日誌,其中包括行號& stacktrace。

另外 - 進入設置 - >調試日誌並啓用跟蹤該集成用戶(這會給你的文件,你可以查看&下載;開發者控制檯有它的怪癖,可以是血腥的慢,但至少它會解析記錄下來讓你更容易閱讀,你可以在其中設置檢查點...)

很難說什麼可能會出錯,你會有更多的運氣與堆棧跟蹤。我的猜測是,utility.duplicateAccountList爲空,然後如果您的代碼執行null.isEmpty()您顯然會被列爲一個錯誤;)

P.S.您是否考慮過將您的Apex作爲適當的「REST服務」而不是VF頁面?

+0

感謝您輸入,用戶是Site Guest用戶,因此無法以他們的身份登錄。我會做一些關於將API暴露爲REST而不是VF的研究,但是我在槍支計時明智的做法下,一如既往,而且這種模式正在爲另一個業務部門工作。 –

+0

您可以使用「設置 - >調試日誌」,在那裏搜索「[站點名稱來賓用戶」用戶記錄並應用調試日誌記錄。如果它是一個網站,那麼它可能是「配置文件」缺少複選框訪問帳戶,機會(嘗試將類定義更改爲「公共而無需共享WebDirectController」?這有點安全風險,但只是爲了看看它是否會改變任何內容。也可以捕獲從PHP發送到「requestb.in」的請求,並嘗試編寫一個單元測試,通過完全相同的參數... – eyescream

+0

感謝您的反饋,因爲這是一個可視化的頁面在調試日誌中沒有任何記錄SF,我試過了。我能夠在指向錯誤的PHP頁面上增加日誌記錄。 –

相關問題