정점의 향후 메소드에 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도 제공해야합니다.

디버그 문을 추가하여 네트워크 ID 값을 확인하여 null 값을 반환하는지 확인할 수 있습니다. getNetworkId ()를 사용하여 그렇게 할 수 있습니다.

getNetworkId ()

사용자의 현재 커뮤니티를 반환합니다.

서명

공개 정적 문자열 getNetworkId ()

반환 값

유형 : 문자열

또한 @future 메서드가 contentversion 레코드에 대한 NetworkId의 컨텍스트를 가져올 수없는 문제를 과거에 보았습니다. ContentVersion을 삽입 한 다음 Partner Communities 사용자로 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;
}