如何在Flow Apex动作中访问嵌套包装类?
Salesforce Flow无法访问Apex Invocable方法中嵌套包装类字段的解决方案
你的代码已为属性添加@InvocableVariable,但Flow仍无法访问深层嵌套字段,核心原因是Flow对Invocable动作的嵌套对象有几个易忽略的要求,以及多层嵌套可能存在的兼容性问题。以下是具体解决方案:
解决方案1:为@InvocableVariable添加label属性并刷新Flow引用
Flow对带有明确label的变量识别更友好,同时确保所有嵌套类为public(你的代码已满足)。修改后重新编译类,并在Flow中删除原有Invocable动作、重新添加:
public class RecordCompletenessAction { public class FlowOutputWrapper { @InvocableVariable(label='Parent Wrapper') public ParentWrapper parent; @InvocableVariable(label='Overall Weightage') public Integer overallWeightage; } public class ParentWrapper { @InvocableVariable(label='Field 1') public MyWrapper field1; @InvocableVariable(label='Field 2') public MyWrapper field2; } public class MyWrapper { @InvocableVariable(label='Field Name') public String fieldName; @InvocableVariable(label='Display Flag') public Boolean display; } @InvocableMethod(label='Process Record Completeness') public static List<FlowOutputWrapper> processFlowAction(List<Id> recordIds) { List<FlowOutputWrapper> results = new List<FlowOutputWrapper>(); ParentWrapper parent = new ParentWrapper(); parent.field1 = new MyWrapper(); parent.field1.fieldName = 'Example Field'; parent.field1.display = true; FlowOutputWrapper output = new FlowOutputWrapper(); output.parent = parent; output.overallWeightage = 80; results.add(output); return results; } }
解决方案2:减少嵌套层级(改用扁平结构)
若三层嵌套仍无法被识别,可将内层属性直接提升到上层,使用无嵌套的扁平结构,Flow可直接访问所有字段:
public class RecordCompletenessAction { public class FlowOutputWrapper { @InvocableVariable(label='Field 1 Name') public String field1Name; @InvocableVariable(label='Field 1 Display') public Boolean field1Display; @InvocableVariable(label='Overall Weightage') public Integer overallWeightage; } @InvocableMethod(label='Process Record Completeness') public static List<FlowOutputWrapper> processFlowAction(List<Id> recordIds) { List<FlowOutputWrapper> results = new List<FlowOutputWrapper>(); FlowOutputWrapper output = new FlowOutputWrapper(); output.field1Name = 'Example Field'; output.field1Display = true; output.overallWeightage = 80; results.add(output); return results; } }
解决方案3:将嵌套类改为顶级类
将ParentWrapper和MyWrapper改为独立的顶级public类,可规避Flow对内部嵌套类的识别问题:
// 顶级类 public class ParentWrapper { @InvocableVariable(label='Field 1') public MyWrapper field1; @InvocableVariable(label='Field 2') public MyWrapper field2; } // 顶级类 public class MyWrapper { @InvocableVariable(label='Field Name') public String fieldName; @InvocableVariable(label='Display Flag') public Boolean display; } public class RecordCompletenessAction { public class FlowOutputWrapper { @InvocableVariable(label='Parent Wrapper') public ParentWrapper parent; @InvocableVariable(label='Overall Weightage') public Integer overallWeightage; } @InvocableMethod(label='Process Record Completeness') public static List<FlowOutputWrapper> processFlowAction(List<Id> recordIds) { List<FlowOutputWrapper> results = new List<FlowOutputWrapper>(); ParentWrapper parent = new ParentWrapper(); parent.field1 = new MyWrapper(); parent.field1.fieldName = 'Example Field'; parent.field1.display = true; FlowOutputWrapper output = new FlowOutputWrapper(); output.parent = parent; output.overallWeightage = 80; results.add(output); return results; } }
Flow对嵌套对象的限制说明
Salesforce官方支持Invocable动作中的嵌套包装类,但实际使用存在以下限制:
- 三层及以上嵌套可能出现识别异常,建议最多使用两层嵌套。
- 内部类必须为
public,且所有需暴露给Flow的属性必须带有@InvocableVariable注解。 - 修改Apex类后,需重新在Flow中添加Invocable动作,确保Flow加载最新的类结构。
内容的提问来源于stack exchange,提问作者yogesh lee
相关产品推荐
相关产品推荐

