ContentVersion-Datensatz kann in zukünftiger Methode nicht in Apex [Duplikat] eingefügt werden

Dec 07 2020

In einer Partner-Community füge ich einen ContentVersion-Datensatz ein, bevor ich ein zukünftiges Callout durchführe, und füge auch einen ContentVersion-Datensatz in ein zukünftiges Callout ein.

Ich kann den ContentVersion-Datensatz vor einem zukünftigen Callout erfolgreich einfügen, aber innerhalb des Fututre-Callouts wird ein Fehler ausgegeben -

System.DmlException: Einfügen fehlgeschlagen. Erste Ausnahme in Zeile 0; Erster Fehler: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, Sie haben nicht die erforderliche Zugriffsebene, um den von Ihnen angeforderten Vorgang auszuführen. Bitte wenden Sie sich an den Eigentümer des Datensatzes oder an Ihren Administrator, wenn ein Zugriff erforderlich ist: [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]*
}

Nicht sicher, warum der ContentVersion-Versionsdatensatz nicht in zukünftige Beschriftungen eingefügt wird.

Antworten

AnudeepGopagoni Dec 07 2020 at 15:21

Die Netzwerk-ID muss ausgefüllt werden, wenn Einfügungen in ContentVersion-Dokumente vorgenommen werden, wenn Communitys aktiviert sind und sich in einem Community-Kontext befinden. Ich habe in der Vergangenheit ähnliche Probleme gesehen, bei denen die Einfügung mit dem folgenden Fehler INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY fehlschlägt, wenn NetworkId nicht vorhanden ist

In der Dokumentation heißt es:

Alle Benutzer mit einer Lizenz für Inhaltsfunktionen können Versionen in ihrer persönlichen Bibliothek erstellen. Benutzer des Kunden- und Partnerportals müssen in der Anfrage auch die Netzwerk-ID der Community angeben.

Sie können Debug-Anweisungen hinzufügen, um den Wert der Netzwerk-ID zu überprüfen und festzustellen, ob sie einen Nullwert zurückgibt. Sie können dies mit getNetworkId () tun

getNetworkId ()

Gibt die aktuelle Community des Benutzers zurück.

Unterschrift

public static String getNetworkId ()

Rückgabewert

Typ: Zeichenfolge

Ich habe in der Vergangenheit auch Probleme gesehen, bei denen die @future-Methode den Kontext der NetworkId für den Inhaltsversionsdatensatz nicht abrufen kann. Beim Einfügen einer ContentVersion und anschließend eines ContentDocumentLink als Benutzer einer Partnergemeinschaft wird die Netzwerk-ID in der ContentVersion korrekt festgelegt. Wenn diese Logik jedoch asynchron ausgeführt wird, z. B. in einer @future-Methode, ist die Netzwerk-ID nicht mehr vorhanden (bestätigt durch Debuggen von Network.getNetworkId () sowohl in der Synchronisierungs- als auch in der Asynchronisierungslogik) und das Einfügen von ContentDocument schlägt mit der Nachricht fehl UNGENÜGENDE ZUGRIFFSRECHTE AUF CROSS-REFERENCE ENTITY (NetworkId).

Eine mögliche Lösung besteht darin, den Wert für networkId in solchen Szenarien extern an die Inhaltsversion zu übergeben. Siehe Beispielcode unten

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