Tidak dapat menyisipkan catatan ContentVersion dalam metode masa depan di puncak [duplikat]

Dec 07 2020

Dalam Komunitas mitra, saya memasukkan catatan ContentVersion sebelum melakukan pemanggilan di masa mendatang dan juga menyisipkan catatan ContentVersion dalam pemanggilan mendatang.

Saya dapat memasukkan catatan ContentVersion sebelum pemanggilan di masa mendatang berhasil, tetapi dalam pemanggilan Fututre Terjadi kesalahan -

System.DmlException: Penyisipan gagal. Pengecualian pertama pada baris 0; kesalahan pertama: INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, Anda tidak memiliki tingkat akses yang diperlukan untuk melakukan operasi yang Anda minta. Silakan hubungi pemilik rekaman atau administrator Anda jika akses diperlukan .: [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]*
}

Tidak yakin mengapa rekaman versi ContentVersion tidak dimasukkan dalam info mendatang.

Jawaban

AnudeepGopagoni Dec 07 2020 at 15:21

NetworkId harus diisi saat melakukan penyisipan pada dokumen ContentVersion saat komunitas diaktifkan dan dalam konteks komunitas. Saya telah melihat masalah serupa di masa lalu di mana Jika NetworkId tidak ada, penyisipan gagal dengan kesalahan berikut INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY

Inilah yang dikatakan dokumentasinya :

Semua pengguna dengan lisensi fitur konten bisa membuat versi di perpustakaan pribadi mereka. Pengguna Portal Pelanggan dan Mitra juga harus menyediakan ID Jaringan komunitas dalam permintaan.

Anda dapat menambahkan pernyataan debug untuk memeriksa nilai id jaringan untuk melihat apakah itu mengembalikan nilai null. Anda dapat melakukannya dengan menggunakan getNetworkId ()

getNetworkId ()

Menampilkan komunitas pengguna saat ini.

Tanda tangan

public static String getNetworkId ()

Nilai Kembali

Jenis: String

Saya juga telah melihat masalah di masa lalu di mana metode @future tidak bisa mendapatkan konteks NetworkId untuk rekaman versi pertentangan. Saat memasukkan ContentVersion dan kemudian ContentDocumentLink sebagai pengguna Komunitas Mitra, Id Jaringan disetel dengan benar di ContentVersion. Namun, jika logika tersebut dijalankan secara asinkron, seperti dalam metode @future, ID Jaringan tidak lagi ada (dikonfirmasi dengan men-debug Network.getNetworkId () dalam logika sinkronisasi dan asinkron) dan penyisipan ContentDocument gagal dengan pesan tersebut HAK AKSES TIDAK CUKUP PADA ENTITAS LINTAS REFERENSI (NetworkId).

Perbaikan potensial adalah meneruskan nilai networkId secara eksternal ke versi konten dalam skenario seperti itu. Lihat kode contoh di bawah ini

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