Ошибка компиляции: выражение поля не допускается для универсального объекта SObject в строке 33, столбец 69
Я пытаюсь написать универсальный контроллер, который будет работать для нескольких различных типов объектов, но когда я пытаюсь получить доступ к настраиваемым полям из этих объектов, я получаю следующую ошибку:
Ошибка компиляции: выражение поля не допускается для универсального объекта SObject в строке 33, столбец 69
Вот мой общий код контроллера:
public with sharing class PhotoUploadController {
public Attachment objAttach{get;set;}
public sObject sobj{get;set;}
public string ObjectName {get;set;}
public Decimal Height{get;set;}
public Decimal Width {get;set;}
Public List<Attachment> lstAttachment {get;set;}
public String setObjectType(sObject newObj)
{
this.ObjectName = newObj.getSObjectType().getDescribe().getName();
return(this.ObjectName );
}
public String getObjectType()
{
return(this.ObjectName);
}
public PhotoUploadController (ApexPages.StandardController controller)
{
objAttach=new Attachment();
lstAttachment= new List<Attachment>();
sobj = controller.getRecord();
if(sobj.id!=null){
sobj = Database.query('select id,name,Image_Attachment_ID__c from ObjectName where id=:sobj.id');
}
if(sobj.Image_Attachment_ID__c!=null){
lstattachment=[SELECT id,body from Attachment where Id=:sobj.Image_Attachment_ID__c limit 1];
if(lstattachment.size()>0)
{
objAttach=lstattachment[0];
}
}
}
public pageReference savePhoto(){
sobj.HeightOfPhoto__c=Height;
sobj.WidthOfPhoto__c=Width;
try {
if (!Schema.sObjectType.sobjectName.isUpdateable())
{
return null;
}
String contentType;
if(objAttach.ContentType !=null){
contentType=objAttach.ContentType;
}
if(contentType !=null && (contentType == 'image/jpeg' || contentType == 'image/CR2' || contentType== 'image/jpg' || contentType== 'image/png' || contentType== 'image/bmp' || contentType== 'image/gif')){
//objAttach.body=body;
//objAttach.name=name;
if(objAttach.body!=null && objAttach.name!=null && sobj.id !=null){
If(objAttach.Id==null)
objAttach.parentId=sobj.id;
if(!Schema.sObjectType.Attachment.isUpdateable()){
return null;
}
try{
upsert objAttach;
sobj.Image_URL__c=URL.getSalesforceBaseUrl().toExternalForm()+'/servlet/servlet.FileDownload?file='+objAttach.id;
sobj.Image_Attachment_ID__c= objAttach.id;
objAttach =null;
if (!Schema.sObjectType.ObjectName.isUpdateable()){
return null;
}
upsert sobj;
}
catch (DMLException e) {
if(e.getMessage().contains('STORAGE_LIMIT_EXCEEDED')){
ApexPages.addMessage(new ApexPages.message(ApexPages.severity.ERROR,'Your orgnization Storage Limit has been exceeded, Please contact your Administrator.'));
}else{
ApexPages.addMessage(new ApexPages.message(ApexPages.severity.ERROR,'Error uploading attachment'));
}
return null;
}finally {
objAttach = new Attachment();
}
}
}
else{
objAttach = new Attachment();
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,'Please, Upload image file with extension .JPG .JPEG .BMP .PNG or .GIF'));
return null;
}
}
catch(Exception e) {
return null;
}
return new pagereference('/'+sobj.id);
}
}
Может кто-нибудь объяснить это сообщение об ошибке немного подробнее? Как получить доступ к нужным полям из общего типа SObject?
1 ответ
В вашем коде есть пара проблем, но причиной сообщения об ошибке является следующий фрагмент:
sobj.Image_Attachment_ID__c
Вы не указали, какой тип SObject вы ожидаете, поэтому нет способа узнать:
- Если SObject в памяти даже имеет это поле
- Что это за поле
- Какие метаданные принадлежат этому полю (если поле было списком выбора, у вас может быть несколько объектов SO с одним и тем же именем поля, но с разными параметрами списка выбора и т. Д.)
Функция get (fieldName) может быть полезна для вас в этом сценарии. Вы можете получить исключение (которое вы можете перехватить), если у SObject нет этого поля, и вы можете преобразовать значение в соответствующий тип данных (так как он будет возвращать только объект), что может выдает ошибку приведения, если значением является datetime и вы пытаетесь привести его к Id и т. д.
Еще одна проблема, которую я заметил:
[SELECT id,body from Attachment where Id=:sobj.Image_Attachment_ID__c limit 1]
никогда не вернет значение. Я думаю ты имел ввиду ParentId=:sobj.Image_Attachment_ID__c
,