Невозможно вставить запись ContentVersion в будущий метод в вершине [дубликат]

Dec 07 2020

В партнерском сообществе я вставляю запись 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 не вставляется в будущую выноску.

Ответы

AnudeepGopagoni Dec 07 2020 at 15:21

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;
}