Попытка отменить ссылку на нулевой объект Страница Salesforce Visual Force

У меня есть сайт PHP, который вызывает конечную точку REST в Salesforce через страницу visualforce. При попытке проверить ответ JSON я подтвердил все обязательные поля, но теперь получаю эту ошибку:

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

Это происходит из следующего класса Apex:

public class WebDirectController {

открытый класс ApiException расширяет Exception {}

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!');
}
}
}

}

Не уверен, что мне не хватает, но я собираюсь 2 недели, чтобы понять это.

Благодарю вас

1

Решение

Я хотел замкнуть цикл на этом. Добавив дорожку стека к сообщению отладки, я смог обнаружить ошибку в настройке, которая разрешила проблему с классом Apex. Элемент строки продукта в классе Utility указывал на неправильный прайс-лист.

Добавление Stack Trace к сообщению отладки было хитростью.

Спасибо

1

Другие решения

Войдите в SF как пользователь, чьи учетные данные вы используете в приложении PHP. Откройте консоль разработчика (в правом верхнем углу, рядом с вашим именем пользователя), выполните вызов из PHP. В идеале вы увидите журнал отладки, созданный с более подробным сообщением об ошибке, включая номер строки & трассировки стека.

В качестве альтернативы — зайдите в Setup -> Debug Logs и включите отслеживание этого пользователя интеграции (это даст вам файлы, которые вы можете просматривать & скачать; В консоли разработчика есть свои причуды, они могут быть чертовски медленными, но, по крайней мере, она проанализирует для вас журнал, чтобы его было легче читать, вы можете установить в нем контрольные точки …)

Трудно сказать, что может пойти не так, вам больше повезет с помощью Stacktrace. Мое дикое предположение, что utility.duplicateAccountList равно нулю, а затем, если ваш код выполняется null.isEmpty() вы, очевидно, получите ошибку;)

Постскриптум Рассматривали ли вы возможность выставить свой кусок Apex как «REST-сервис», а не как страницу VF?

0

По вопросам рекламы [email protected]