Попытка очистить контейнер ApexPages.Messages - PullRequest
0 голосов
/ 05 июня 2018

Я прошу прощения за длинный вопрос.

Контекст: у нас есть отображение, которое в основном отображает поле из одного объекта в поле другого объекта.Объект от A до Object_B.В триггере объекта A мы смотрим, есть ли отображение на объект B. Если это так, мы загружаем запись объекта b и копируем значение из определенного поля в A в поле в B. После того, как мы сделали всекопии, которые мы обновляем B.

У нас есть попытка обойти обновление B, чтобы перехватить любые исключения.Проблема, с которой мы сталкиваемся, заключается в том, что исключение выдается из проверки Salesforce, а не из пользовательского правила проверки, и создает сообщения автоматически.Например, кто-то ввел 123.45, и поле в объекте b, к которому он пытается передать, отформатировано как число 2.0.Это сгенерирует исключение DML для недопустимого диапазона.Что хорошо.Проблема в том, что Salesforce также добавляет ошибку в контейнер apexPages.Messages.Так что если у нас есть на странице, это будет отображать ошибку Salesforce

Есть 2 проблемы с этим.1. Сообщение не очень удобно для пользователя.2. Сообщение содержит метку поля поля на объекте B, а не поля на объекте A. Пользователь в этом контексте не будет знать, что это за поле, и, возможно, с 100 полями на странице, которые он заполнил, он можетне сможет отследить его.

Я бы предпочел, чтобы SF не добавлял сообщение автоматически, что позволило мне перехватить исключение и отформатировать сообщение.Но я не вижу ни одного способа остановить SF от создания сообщения или очистки контейнера сообщений, чтобы мы могли добавить наше собственное.

Есть ли способ остановить Salesforce от автоматического добавления сообщения или очистить apexPage.Messages без обновления страницы?

отредактировано, чтобы показать быстрый пример кода:

list<Contact> contacts = [Select id,Email from Contact where id='someSFId'];
contacts[0].email = 'badEmail';
try{
    update contacts;
}
catch(Exception ex)
{
    System.debug(Apexpages.hasMessage());
}

Вы увидите, что результаты отладки будут верными, даже если я не добавил сообщение.

1 Ответ

0 голосов
/ 05 июня 2018

Надеюсь, это поможет любому.

   List<ApexPages.Message> msgs = ApexPages.getMessages();
    for(ApexPages.Message message : msgs ){
       // get the object A field label from maaping 
       // construct custom error message/ replace field label string
    }

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_apexpages.htm

...