SFDC Apex代码:从"未来"访问类级静态变量方法

时间:2014-05-19 17:10:14

标签: web-services asynchronous salesforce apex-code apex

我需要从我的ApexController类中调用webservice。为此,我有一个带有@future属性的asycn方法(callout = true)。 webservice调用需要提示从VF页面在save调用中填充的对象。

因为静态(未来)调用并不是所有对象都作为方法参数传入,所以我计划在静态Map中添加数据并访问静态方法中的数据来进行web服务调用。但是,静态Map对象正在重新初始化,并且在静态方法中为null。

如果有人能给我一些关于如何解决这个问题的问题,我将非常感激。 谢谢!

以下是代码剪辑:

      private static Map<String, WidgetModels.LeadInformation> leadsMap;

       ....
       ......
        public PageReference save() {

       if(leadsMap == null){
           leadsMap = new Map<String, WidgetModels.LeadInformation>();
        }
        leadsMap.put(guid,widgetLead);

       }
        //make async call to Widegt Webservice
        saveWidgetCallInformation(guid)

       //async call to widge webserivce  
      @future (callout=true)
      public static void saveWidgetCallInformation(String guid) {
        WidgetModels.LeadInformation cachedLeadInfo =   
        (WidgetModels.LeadInformation)leadsMap.get(guid);
      .....
      //call websevice

      }

1 个答案:

答案 0 :(得分:4)

@future是完全独立的执行上下文。它将无法访问任何调用它的历史记录(意味着所有静态变量都被重置,您从新的调控器限制开始等。就像用户启动的新操作一样)。

它唯一“知道”的是传递给它的方法参数。并且你无法传递整个对象,你需要传递基元(Integer,String,DateTime等)或基元集合(List,Set,Map)。

如果您可以从数据库访问所需的所有信息 - 只需传递一个List<Id>并查询它。

如果你不能 - 你可以通过序列化你的对象并将它们作为List<String>传递来作弊。查看有关JSON类的文档或这两个方便的帖子:


旁注 - 你能重新考虑一下你的流量吗?如果起点是Visualforce,则可以跳过@future步骤。首先进行标注,然后是DML(如果需要)。这样,通常的“你有未提交的工作待定”错误将不会被触发。这件事不仅是为了惹恼开发者;还有就是让你重新思考你的设计。您要求该应用程序具有开放交易&amp;锁在桌子上最多2分钟。并且你给自己额外的工作 - 当插入没问题但是标注失败时你会正确地回滚你的更改吗?

通过颠倒操作顺序(首先是callout,然后是DML),你可以简化它 - 没有对DB的保存尝试,所以如果保存失败,没有什么可以回滚。