Nie można wstawić rekordu ContentVersion w przyszłej metodzie w wierzchołku [duplikat]

Dec 07 2020

W społeczności partnerskiej wstawiam rekord ContentVersion przed wykonaniem przyszłego wywołania, a także wstawiam rekord ContentVersion w przyszłym wywołaniu.

Mogę wstawić rekord ContentVersion przed przyszłym wywołaniem, ale w ramach objaśnienia Fututre powoduje to błąd -

System.DmlException: wstawianie nie powiodło się. Pierwszy wyjątek w wierszu 0; pierwszy błąd: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, Nie masz poziomu dostępu niezbędnego do wykonania żądanej operacji. Skontaktuj się z właścicielem rekordu lub administratorem, jeśli dostęp jest konieczny: [Identyfikator sieci]

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]*
}

Nie jestem pewien, dlaczego rekord wersji ContentVersion nie zostanie wstawiony w przyszłym objaśnieniu.

Odpowiedzi

AnudeepGopagoni Dec 07 2020 at 15:21

NetworkId jest wymagane podczas wstawiania do dokumentów ContentVersion, gdy społeczności są włączone oraz w kontekście społeczności. Widziałem podobne problemy w przeszłości, gdzie jeśli NetworkId nie istnieje, wstawianie kończy się niepowodzeniem z następującym błędem INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY

Oto, co mówi dokumentacja :

Wszyscy użytkownicy z licencją na funkcje zawartości mogą tworzyć wersje w swojej bibliotece osobistej. Użytkownicy portalu klientów i partnerów muszą również podać identyfikator NetworkId społeczności w żądaniu.

Możesz dodać instrukcje debugowania, aby sprawdzić wartość identyfikatora sieci i sprawdzić, czy zwraca wartość null. Możesz to zrobić za pomocą getNetworkId ()

getNetworkId ()

Zwraca bieżącą społeczność użytkownika.

Podpis

public static String getNetworkId ()

Wartość zwracana

Typ: ciąg

W przeszłości widziałem również problemy, w których metoda @future nie była w stanie uzyskać kontekstu NetworkId dla rekordu contentversion. Podczas wstawiania ContentVersion, a następnie ContentDocumentLink jako użytkownika społeczności partnerskich, identyfikator sieci jest poprawnie ustawiany w ContentVersion. Jeśli jednak ta logika jest wykonywana asynchronicznie, na przykład w metodzie @future, identyfikator sieci nie jest już obecny (potwierdzony przez debugowanie Network.getNetworkId () zarówno w logice synchronizacji, jak i asynchronizacji), a wstawianie ContentDocument kończy się niepowodzeniem z komunikatem NIEWYSTARCZAJĄCE PRAWA DOSTĘPU DO PODMIOTU ODNIESIENIA (NetworkId).

Potencjalnym rozwiązaniem jest przekazanie wartości networkId zewnętrznie do contentversion w takich scenariuszach. Zobacz przykładowy kod poniżej

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