Salesforce使用Apex创建Account对象报DML requires SObject or SObject list type: account错误问询
错误诱因
- 核心原因是标准SObject
Account的类型被自定义内容覆盖了,Apex对类型大小写不敏感,只要存在和Account大小写变体同名的自定义内容,就会覆盖默认的系统SObject类型,这也刚好解释了其他对象操作正常的现象:其他对象没有同名冲突所以可被正常识别为SObject:- 当前代码上下文内存在名为
Account/account的自定义类、成员变量、局部变量,你实例化的实际上是自定义类的对象而非SObject实例 - 代码头部导入了非系统标准命名空间下的
Account类,优先级高于系统默认SObject类型
- 当前代码上下文内存在名为
排查步骤
- 全局搜索当前Apex类内所有
Account、account关键词,排查是否存在重名的自定义类、变量定义 - 检查代码头部的
import语句,确认是否引入了第三方/自定义命名空间下的Account类型 - 在DML操作前加入调试语句验证类型:
System.debug(Account.class.getTypeName());,如果输出结果不是Schema.Account即可确认类型被覆盖
修复方案
- 最快修复方案:直接在Account前加
Schema.前缀强制指定使用系统标准SObject类型,代码示例:
// 原错误写法,会调用被覆盖的自定义类型 Account newAcc = new Account(Name = '测试企业'); insert newAcc; // 修正后写法,明确调用标准SObject Schema.Account newAcc = new Schema.Account(Name = '测试企业'); insert newAcc;
- 长期规范方案:修改和标准对象重名的自定义类、变量命名,比如将自定义Account类改为
AccountDTO、AccountBiz等,避免后续再出现同类冲突 - 如果是导入导致的冲突:删除非必要的
import语句即可
内容的提问来源于stack exchange,提问作者Umang
相关产品推荐
相关产品推荐

