Ошибка Salesforce при совершении вызова API веб-службы - PullRequest
4 голосов
/ 23 февраля 2012

Я получаю следующую ошибку при вызове функции add () You have uncommitted work pending. Please commit or rollback before calling out

Я вызываю getItems() для заполнения раскрывающегося списка, а затем функцию add для вставки выбранного элемента извыпадающий

 public PageReference add() {
              insert technology;
              return null;
            }

public List<SelectOption> getItems() {
    List<SelectOption> options = new List<SelectOption>();
    List<Technology__c> AddedT=[SELECT Name FROM Technology__c];
    HttpRequest req = new HttpRequest(); 
    req.setMethod('GET');
    req.setEndpoint('http://submit.toolsberry.com/sfdc/technologies');
    Http http = new Http();
    HTTPResponse res = http.send(req);  
    String response=res.getBody();
    XmlStreamReader reader = new XmlStreamReader(response);
     List<String> AllTech = new List<String>();
     while(reader.hasNext()) {    
     if (reader.getEventType() == XmlTag.START_ELEMENT) {
        if ('string' == reader.getLocalName()) {
    while(reader.hasNext()) {
     if (reader.getEventType() == XmlTag.END_ELEMENT) {
        break;
     } else if (reader.getEventType() == XmlTag.CHARACTERS) {
        String tname = reader.getText();
        AllTech.add(tname);
    }
    reader.next();
 }
        }
     }
    reader.next();
 }
}

1 Ответ

7 голосов
/ 23 февраля 2012

Это потому, что вам нужно делать все свои DML ПОСЛЕ того, как вы сделали какие-либо выноски, а не раньше. Поэтому любые операторы вставки / обновления / вставки или удаления должны следовать любым http.send(req); вызовам.

** Похоже, ваш список пополняется после вызова метода add (), потому что ваш список находится в методе получения **

Это зависит от потока и должно происходить в последовательности для каждого конкретного потока. Так, например, когда пользователь нажимает кнопку с методом действия, все операторы DML в этом вызове должны следовать за любыми выносками, которые происходят в том же потоке. То же самое для триггера или партии Apex.

Это может быть вызвано тем, что где-то есть получатель / установщик, который обновляет данные. Например:

public String someProperty
{
   get
   {
      return [SELECT Name FROM CustomObject__c WHERE Id = :this.someId];
   }

   set(String s)
   {
      CustomObject__c c = [SELECT Name FROM CustomObject__C WHERE Id = :this.someId]
      c.Name = s;
      update c;
   }
}

Кроме того, никогда не помещайте выноску в геттер. Всегда помещайте выноску в явный метод, который делает это один раз и только один раз. Геттеры будут уволены несколько раз, а выноски имеют строгие ограничения в Apex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...