gpt4 book ai didi

调用 Web 服务 api 时出现 Salesforce 错误

转载 作者:行者123 更新时间:2023-12-04 16:24:23 25 4
gpt4 key购买 nike

调用函数 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();
}
}

最佳答案

这是因为您需要在完成任何标注之后而不是之前完成所有 DML。所以任何插入/更新/更新插入或删除语句都必须跟在任何 http.send(req); 之后。调用。

** 调用 add() 方法后,您的列表似乎正在重新填充,因为您的列表驻留在 getter 方法中 **

这是特定于线程的,并且必须按任何给定线程的顺序发生。因此,例如,当用户单击带有操作方法的按钮时,该调用中的所有 DML 语句都必须遵循发生在同一线程中的任何标注。触发器或批处理 Apex 相同。

在某处有一个以某种方式更新数据的 getter/setter 可能会导致这种情况。例如:

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;
}
}

另外,永远不要在 getter 中添加标注。始终将标注放在一次且仅执行一次的显式方法中。 Getter 将被多次解雇,并且标注在 Apex 中有严格的限制。

关于调用 Web 服务 api 时出现 Salesforce 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9417253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com