You need to sign in to do that
Don't have an account?
dujsu
Webservice Error: You have uncommitted work pending. Please commit or rollback before calling out
Hello,
Im all of a sudden getting the following error from my class that invokes a webservice:
ERROR:System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out
Webservice Class
global class myWS { WebService static string invokeExternalWs(string childValue, string parentValue) { HttpRequest req = new HttpRequest(); req.setEndpoint('https://externalURL/Services'); req.setMethod('POST'); req.setHeader('Content-Type', 'text/xml; charset=utf-8'); req.setHeader('SOAPAction', 'http://externalService/externalMethod'); string b = '--soap request goes here--'; req.setBody(b); Http http = new Http(); try { //Execute web service call here String xObjectID =''; HTTPResponse res = http.send(req); Dom.Document doc = res.getBodyDocument(); String soapNS = 'http://schemas.xmlsoap.org/soap/envelope/'; Dom.XmlNode root = doc.getRootElement(); for(dom.XmlNode node1 : root.getChildElements()) { for(dom.XmlNode node2 : node1.getChildElements()) { for(dom.XmlNode node3 : node2.getChildElements()) { for(dom.XmlNode node4 : node3.getChildElements()) { xObjectID = node4.getText(); } } } } return xObjectID; } catch(System.CalloutException e){ return 'ERROR:' + e; } } }
UPDATE: Here is my class that is executing myWS
public void applyURLString(ID ArgBuildID) { Builder__c current_build = [SELECT id, name, LLURL__c, column1, column2, Opportunity__c FROM Builder__c WHERE id = :ArgBuildID]; if(current_build.LLURL__c == null || current_build.LLURL__c.trim().length() == 0) { String tmpFolderName = current_build.column1 + ' - ' + current_build.column2; String LLWSResultPattern = '[0-9]{2,}'; String myWSXMLResult = myWS.invokeExternalWs(tmpFolderName,'test'); Boolean LLWSPatternMatched = pattern.matches(LLWSResultPattern,myWSXMLResult); if(LLWSPatternMatched) { Opportunity oppt = [SELECT Id,Name FROM Opportunity WHERE Id = :current_build.Opportunity__c LIMIT 1]; oppt.LLURL__c = 'https://someService/' + myWSXMLResult; update oppt; } } }
UPDATE #2 - Here is the code that executes applyURLString()
Builder__c insertBuild = new Builder__c(); insertBuild.Opportunity__c = opportunityId; insertBuild.Product_Group__c = selectedBuild.Product_Group__c; insertBuild.Manual_Build_Product__c = selectedBuild.Manual_Build_Product__c; insert insertBuild; applyURLString(insertBuild.Id);
Thank you for your time!
Ive updated my original post with additional code. See "UPDATE".
Just wanted to pass along the solution that was suggested to me on stackoverflow. An @future annotation was added to the applyURLString() method. For my specific case it has worked perfectly.
Hope this helps someone in the future.