如何使用Metadata Tooling Api创建Workflow字段更新?创建失败求助
使用MetadataService创建Workflow字段更新失败的排查与修复
你的代码里存在几个关键问题,这是导致创建操作失败的核心原因:
- SessionId设置错误:Metadata API的SessionHeader不需要拼接Org Id和SessionId,直接使用
UserInfo.getSessionId()赋值即可,原拼接方式会导致认证失败。 - fullName格式不符合规范:WorkflowFieldUpdate的fullName必须遵循
[对象API名].[字段更新API名]的格式,你只写了字段更新的名称,系统无法识别它的归属对象。 - 字段引用冗余:
field属性只需填写字段的API名即可,不需要带上对象前缀——因为已经通过targetObject指定了所属对象。 - Literal值类型可能不匹配:如果
Status__c是数值型字段,把literalValue设为字符串'1'会导致类型不兼容,需改成数值类型;如果是picklist字段,要确认值是该选项的API值而非显示值。
修正后的完整代码
MetadataService.MetadataPort service = new MetadataService.MetadataPort(); // 修正SessionId设置 service.SessionHeader = new MetadataService.SessionHeader_element(); service.SessionHeader.sessionId = UserInfo.getSessionId(); MetadataService.WorkflowFieldUpdate workflowFieldUpdate = new MetadataService.WorkflowFieldUpdate(); // Workflow Field Update workflowFieldUpdate.fullName = 'Expense__c.TEST_Active_Permission'; // 修正fullName格式 workflowFieldUpdate.description = 'Activates a permission.'; workflowFieldUpdate.field = 'Status__c'; // 去掉对象前缀 workflowFieldUpdate.literalValue = '1'; // 若为数值型字段,改为1(根据实际字段类型调整) workflowFieldUpdate.name = 'TEST Active Permission'; workflowFieldUpdate.notifyAssignee = false; workflowFieldUpdate.operation = 'Literal'; workflowFieldUpdate.protected_x = false; workflowFieldUpdate.reevaluateOnChange = true; workflowFieldUpdate.targetObject = 'Expense__c'; MetadataService.Metadata[] theMetadata = new MetadataService.Metadata[]{workflowFieldUpdate}; MetadataService.SaveResult[] results = service.createMetadata(theMetadata); // 打印详细错误信息,精准定位问题 for(MetadataService.SaveResult res : results){ if(!res.success){ for(MetadataService.Error err : res.errors){ System.debug('错误信息:' + err.message + ',关联字段:' + err.field); } } }
另外建议你不要只打印results整体,而是遍历每个SaveResult的错误信息,这样能直接看到具体的失败原因,比如权限不足、字段不存在、格式错误等。
内容的提问来源于stack exchange,提问作者Bharat Motwani
相关产品推荐
相关产品推荐

