Apex开发编译报错Invalid type: Schema.Instance_History求助
Apex编译错误"Invalid type: Schema.Instance_History"排查方案
核心原因
该错误是Apex编译器在静态校验阶段无法识别Instance_History对应的SObject类型导致的,按以下顺序排查即可定位:
- 验证自定义对象存在性
进入设置→对象管理器,搜索Instance_History,确认其API名称完全匹配Instance_History__c,无拼写错误、下划线数量错误,也未被放入回收站。即使你确认加了双下划线后缀,也需要排查是否有单词拼写错误、多余空格等问题。 - 排查命名空间适配问题
若你的Org启用了自定义命名空间,或安装了包含该对象的受管包,需要在对象API名称前补充命名空间前缀,格式为[命名空间标识符]__Instance_History__c,替换代码中所有对应的对象引用。 - 校验对象访问权限
确认编译代码的用户、以及Apex类运行上下文对应的配置文件/权限集,拥有Instance_History__c对象的读取、创建权限,权限不足时也会抛出类型无效的编译错误。 - 规避与标准历史对象的冲突
如果你开启了Instance__c对象的标准字段历史跟踪功能,Salesforce会自动生成Instance__History标准系统对象,若你的自定义对象命名过于接近该规则,可尝试修改自定义对象的API名称,避免编译器识别混淆。 - 动态引用兼容方案
若以上排查均无问题,可改用动态SObject引用的方式绕过静态校验,修改后的代码逻辑如下:public class InstanceTriggerHandler { public static void createInstanceHistoryRecord(Map<ID,Instance__c> newMap, Map<ID,Instance__c> oldMap) { List<SObject> listOfIntHistoryToCreate = new List<SObject>(); List<Schema.FieldSetMember> trackedFields = SObjectType.Instance__c.FieldSets.Case_View.getFields(); SObjectType historySObjectType = Schema.getGlobalDescribe().get('Instance_History__c'); if (trackedFields.isEmpty() || historySObjectType == null) return; for(Instance__c ins:newMap.values()) { for (Schema.FieldSetMember fst : trackedFields) { String fieldName = fst.getFieldPath(); String fieldLabel = fst.getLabel(); Instance__c oldInstance = (oldMap != null) ? oldMap.get(ins.id) : new Instance__c(); if (ins.get(fieldName) != oldInstance.get(fieldName)) { String newValue = String.valueOf(ins.get(fieldName)); String oldValue = String.valueOf(oldInstance.get(fieldName)); if (oldValue != null && oldValue.length()>255) { oldValue = oldValue.substring(0,255); } if (newValue != null && newValue.length()>255) { newValue = newValue.substring(0,255); } SObject instanceHistory = historySObjectType.newSObject(); instanceHistory.put('Field__c', fieldLabel); instanceHistory.put('Instance__c', ins.Id); instanceHistory.put('Field_API__c', fieldName); instanceHistory.put('Original_Value__c', oldValue); instanceHistory.put('New_Value__c', newValue); listOfIntHistoryToCreate.add(instanceHistory); } } } if(!listOfIntHistoryToCreate.isEmpty()) { insert listOfIntHistoryToCreate; } } }
内容的提问来源于stack exchange,提问作者Ashish Malhotra
相关产品推荐
相关产品推荐

