Невозможно вставить запись ContentVersion в будущий метод в вершине [дубликат]
В партнерском сообществе я вставляю запись ContentVersion перед выполнением будущей выноски, а также вставляю запись ContentVersion в будущую выноску.
Я могу успешно вставить запись ContentVersion перед будущей выноской, но внутри выноски Fututre выдает ошибку -
System.DmlException: Ошибка вставки. Первое исключение в строке 0; первая ошибка: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, у вас нет уровня доступа, необходимого для выполнения запрошенной вами операции. Если необходим доступ, обратитесь к владельцу записи или администратору: [NetworkId]
public class myclass
{
....
insert ContentVersion1; // Able to insert record
callout();
}
@future(callout = true)
callout(){
...
insert ContentVersion2; // Gives error *System.DmlException: Insert failed. First exception on row 0; first error: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, You do not have the level of access necessary to perform the operation you requested. Please contact the owner of the record or your administrator if access is necessary.: [NetworkId]*
}
Не уверен, почему запись версии ContentVersion не вставляется в будущую выноску.
Ответы
NetworkId необходимо заполнять при вставке в документы ContentVersion, когда сообщества включены и в контексте сообщества. Я видел подобные проблемы в прошлом, когда если NetworkId не существует, вставка не выполняется со следующей ошибкой INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY
Вот что говорится в документации :
Все пользователи с лицензией на функции контента могут создавать версии в своей личной библиотеке. Пользователи клиентского и партнерского портала также должны указать в запросе NetworkId сообщества.
Вы можете добавить операторы отладки, чтобы проверить значение идентификатора сети, чтобы узнать, возвращает ли он нулевое значение. Вы можете сделать это с помощью getNetworkId ()
getNetworkId ()
Возвращает текущее сообщество пользователя.
Подпись
общедоступная статическая строка getNetworkId ()
Возвращаемое значение
Тип: Строка
Я также сталкивался с проблемами в прошлом, когда метод @future не мог получить контекст NetworkId для записи contentversion. При вставке ContentVersion, а затем ContentDocumentLink в качестве пользователя партнерских сообществ сетевой идентификатор правильно установлен для ContentVersion. Однако, если эта логика выполняется асинхронно, например, в методе @future, идентификатор сети больше не присутствует (подтверждено отладкой Network.getNetworkId () как в логике синхронизации, так и в асинхронной логике), и вставка ContentDocument завершается ошибкой с сообщением НЕДОСТАТОЧНЫЕ ПРАВА ДОСТУПА ДЛЯ ПЕРЕКРЕСТНОЙ ССЫЛКИ (NetworkId).
Возможное решение - в таких сценариях передать значение networkId извне в версию содержимого. См. Пример кода ниже
public static void methodCall(){
String netId = network.getNetworkId();
dummyFutureCall('0010I00002GitdvQAB',netId);
}
@future
public static void dummyFutureCall(Id BasketId,String netValue){
system.debug('**networkId In method : ' + network.getNetworkId());
system.debug('**networkId In method : ' + netValue);
ContentVersion cv = new ContentVersion();
cv.Title = 'Test Document';
cv.PathOnClient = 'TestDocument.pdf';
cv.VersionData = Blob.valueOf('Test Content');
cv.IsMajorVersion = true;
cv.NetworkId = netValue;
Insert cv;
//Get Content Documents
List<ContentVersion> docList = [SELECT Id, contentDocumentId FROM ContentVersion where id =: cv.id ];
//Create ContentDocumentLink
ContentDocumentLink cdl = New ContentDocumentLink();
cdl.LinkedEntityId = basketId;
cdl.ContentDocumentId = docList[0].contentDocumentId;
cdl.shareType = 'V';
Insert cdl;
}