apexのfutureメソッドに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バージョンレコードが将来のコールアウトに挿入されない理由がわかりません。
回答
コミュニティが有効になっていて、コミュニティコンテキストで、ContentVersionドキュメントに挿入を行う場合は、NetworkIdを入力する必要があります。NetworkIdが存在しない場合、挿入が次のエラーINSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITYで失敗するという同様の問題を過去に見ました。
ここでは何であるドキュメントは言います:
コンテンツ機能ライセンスを持つすべてのユーザーは、個人のライブラリにバージョンを作成できます。カスタマーポータルおよびパートナーポータルのユーザーは、リクエストでコミュニティのNetworkIdも指定する必要があります。
デバッグステートメントを追加して、ネットワークIDの値をチェックし、null値を返しているかどうかを確認できます。getNetworkId()を使用してこれを行うことができます
getNetworkId()
ユーザーの現在のコミュニティを返します。
署名
public static String getNetworkId()
戻り値
タイプ:文字列
また、過去に@futureメソッドがcontentversionレコードのNetworkIdのコンテキストを取得できないという問題も発生しました。ContentVersionを挿入してからContentDocumentLinkをパートナーコミュニティユーザーとして挿入すると、ネットワークIDがContentVersionに正しく設定されます。ただし、そのロジックが@futureメソッドのように非同期で実行されると、ネットワークIDは存在しなくなり(同期ロジックと非同期ロジックの両方でNetwork.getNetworkId()をデバッグすることで確認されます)、ContentDocumentの挿入はメッセージで失敗します。相互参照エンティティ(NetworkId)の不十分なアクセス権。
潜在的な修正は、そのようなシナリオでnetworkId値をcontentversionに外部から渡すことです。以下のサンプルコードを参照してください
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;
}