web-services - SFDC 顶点代码 : Access class level static variable from "Future" method

标签 web-services asynchronous salesforce apex-code apex

我需要从我的 ApexController 类中调用 Web 服务。为此,我有一个带有属性 @future (callout=true) 的 asycn 方法。 Web 服务调用需要引用在 VF 页面的保存调用中填充的对象。

由于静态( future )调用并非所有对象都作为方法参数传入,因此我计划在静态 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

      }

最佳答案

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

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

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

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


旁注 - 你能重新考虑一下你的流程吗?如果起点是 Visualforce,您可以跳过 @future 步骤。首先进行标注,然后进行 DML(如果需要)。这样,通常的“您有未提交的工作待处理”错误就不会被触发。这个东西的存在不仅是为了惹恼开发人员;)它的存在是为了让你重新思考你的设计。您要求应用程序打开事务并锁定表最多 2 分钟。而且您给自己带来了额外的工作 - 当插入正常但标注失败时,您会正确回滚更改吗?

通过颠倒操作顺序(先调用,然后 DML),您可以使其变得更简单 - 没有尝试保存到数据库,因此如果保存失败,则无需回滚。

关于web-services - SFDC 顶点代码 : Access class level static variable from "Future" method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23743461/

相关文章:

node.js - Node.js 中的异步任务

python - 获取 SalesforceMalformedRequest : Malformed request error

java - 基于 Java 的 REST 服务 (JSON) 是否一定需要第三方框架?

ios - 从应用程序内访问已安装的配置文件/证书

javascript - 如何从异步调用返回响应?

Google Docs ImportXML 的 XPath 查询

ruby-on-rails - 未在 Rails 中为此组织启用 REST API(使用 databasedotcom gem 的 Salesforce API)

java - 如何使用 ksoap2 验证 sap web 服务

java - src/main/resources 文件被 src/test/resources 覆盖

c# - : "Client side asynchronous frameworks"是什么意思