yat*_*hta 4 salesforce visualforce apex-code
当我调用函数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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为你需要在完成任何标注后完成所有DML,而不是之前.因此任何insert/update/upsert或delete语句都必须遵循任何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;
}
}
Run Code Online (Sandbox Code Playgroud)
此外,永远不要在getter中添加标注.始终将callout放在一个只执行一次的显式方法中.Getter将多次被解雇,并且标注在Apex中有严格的限制.
| 归档时间: |
|
| 查看次数: |
2511 次 |
| 最近记录: |