An unexpected error occurred: failed to lazily initialize a collection of role: sailpoint.object.Identity.links, could not initialize proxy - no Session

Which IIQ version are you inquiring about?

8.4P2

Share all details about your problem, including any error messages you may have received.

*Team,

For a webservices application, we’ve developed a before provisioning rule, the purpose is application supports only single Entitlement/Role at a time.

We need to explicitly clean-up existing IT role and trying to add it in the Access Request but encountered with below error.*

| An unexpected error occurred: failed to lazily initialize a collection of role: sailpoint.object.Identity.links, could not initialize proxy - no Session
```
if (plan != null) {
try {
String id = plan.getNativeIdentity();

Identity identity = context.getObjectByName(Identity.class, id);
	List<AccountRequest> accountRequestList = new ArrayList();
	for (AccountRequest accountRequest : plan.getAccountRequests()) {
		String nativeID = accountRequest.getNativeIdentity();
		if (accountRequest.getOp().equals(ProvisioningPlan.ObjectOperation.Modify)) {
			boolean hasAdd = false;
			boolean hasRemove = false;
			for (AttributeRequest attributeRequest : accountRequest.getAttributeRequests()) {
				if ("role".equals(attributeRequest.getName()) && attributeRequest.getValue() != null) {
					if ("Add".equalsIgnoreCase(attributeRequest.getOp().name())) {
						hasAdd = true;
					} else if ("Remove".equalsIgnoreCase(attributeRequest.getOp().name())) {
						hasRemove = true;
					}
				}
			}
			if (hasAdd && hasRemove) {
			Iterator<AttributeRequest> it = accountRequest.getAttributeRequests().iterator(); 
			while (it.hasNext()) {
			 AttributeRequest attributeRequest = it.next(); 
			 if("role".equals(attributeRequest.getName()) && "Remove".equalsIgnoreCase(attributeRequest.getOp().name()) && attributeRequest.getValue() != null) { 
			 it.remove();
			}
			} 
			} else if (hasAdd && !hasRemove) {
				List<RoleDetection> listOfRoles = identity.getRoleDetections(application);
				for (RoleDetection rd : listOfRoles) {
					String comments = "Auto removed as it's a single entitlement application";
					Attributes att = new Attributes();
					Map attMap = new HashMap();
					attMap.put("comments", comments);

					String parentBundle = "";
					String roleName = rd.getRoleName();

					List<RoleAssignment> roleAssignments = identity.getRoleAssignments();
					if (null != roleAssignments && !roleAssignments.isEmpty()) {

						for (RoleAssignment roleAssingment : roleAssignments) {
							List<RoleAssignment> permittedRoleAssignments = roleAssingment
									.getPermittedRoleAssignments();
							if (null != permittedRoleAssignments && !permittedRoleAssignments.isEmpty()) {

								for (RoleAssignment permittedRoleAssignment : permittedRoleAssignments) {

									if (permittedRoleAssignment.getRoleName().equalsIgnoreCase(roleName)) {

										parentBundle = roleAssingment.getRoleName();
									}

								}

							}

						}
					}

					if (parentBundle != "") {
						attMap.put("permittedBy", parentBundle);
						attMap.put("assignment", true);

					}

					att.putAll(attMap);

					AttributeRequest attrReq = new AttributeRequest("detectedRoles",
							ProvisioningPlan.Operation.Remove, roleName);

					attrReq.setArgs(att);
					Provisioner p = new Provisioner(context);
					ProvisioningPlan newPlan = new ProvisioningPlan();
					newPlan.setIdentity(identity);
					p.setOptimisticProvisioning(true);
					AccountRequest newAcc = new AccountRequest();
					newAcc.setApplication("IIQ");
					newAcc.setTargetIntegration("IIQ");
					newAcc.setNativeIdentity(identity.getName());
					newAcc.add(attrReq);
					newAcc.setOperation(ProvisioningPlan.AccountRequest.Operation.Modify);
					newPlan.add(newAcc);
					p.execute(newPlan);
					String workflowName = "LCM Provisioning";
					String caseName = "Role Assignment for : " + identity.getName();

				}
			}
		}
	}
} catch (Exception e) {
	e.printStackTrace();
}

}`
context.decache();

Hi @harishabn,

try to remove context.decache();

Yes correct, if you remove context.decache(); from the code, it will not throw the error. We have got the same error , and by commenting it, we are not getting the error.

I have tried fixing your code, can you use the below code and see if it gives you the desired solution, check for the syntax.


if (plan != null) {
    try {
        String id = plan.getNativeIdentity();
        
       
        Identity identity = context.getObjectByName(Identity.class, id);
        
        if (identity != null) {
           
            List links = identity.getLinks();
            if (links != null) {
                links.size(); 
            }
            
            
            List roleAssignments = identity.getRoleAssignments();
            if (roleAssignments != null) {
                roleAssignments.size(); 
                // Also initialize nested collections
                for (RoleAssignment ra : roleAssignments) {
                    List permitted = ra.getPermittedRoleAssignments();
                    if (permitted != null) {
                        permitted.size();
                    }
                }
            }
        }
        
        List accountRequestList = new ArrayList();
        
        for (AccountRequest accountRequest : plan.getAccountRequests()) {
            String nativeID = accountRequest.getNativeIdentity();
            
            if (accountRequest.getOp().equals(ProvisioningPlan.ObjectOperation.Modify)) {
                boolean hasAdd = false;
                boolean hasRemove = false;
                
                for (AttributeRequest attributeRequest : accountRequest.getAttributeRequests()) {
                    if ("role".equals(attributeRequest.getName()) && attributeRequest.getValue() != null) {
                        if ("Add".equalsIgnoreCase(attributeRequest.getOp().name())) {
                            hasAdd = true;
                        } else if ("Remove".equalsIgnoreCase(attributeRequest.getOp().name())) {
                            hasRemove = true;
                        }
                    }
                }
                
                if (hasAdd && hasRemove) {
                    Iterator it = accountRequest.getAttributeRequests().iterator();
                    while (it.hasNext()) {
                        AttributeRequest attributeRequest = (AttributeRequest) it.next();
                        if ("role".equals(attributeRequest.getName()) && 
                            "Remove".equalsIgnoreCase(attributeRequest.getOp().name()) && 
                            attributeRequest.getValue() != null) {
                            it.remove();
                        }
                    }
                } else if (hasAdd && !hasRemove) {
                   
                    List listOfRoles = identity.getRoleDetections(application);
                    
                    if (listOfRoles != null && !listOfRoles.isEmpty()) {
                        for (Object rdObj : listOfRoles) {
                            RoleDetection rd = (RoleDetection) rdObj;
                            String comments = "Auto removed as it's a single entitlement application";
                            Attributes att = new Attributes();
                            Map attMap = new HashMap();
                            attMap.put("comments", comments);
                            
                            String parentBundle = "";
                            String roleName = rd.getRoleName();
                            
                           
                            List roleAssignmentsList = identity.getRoleAssignments();
                            if (roleAssignmentsList != null && !roleAssignmentsList.isEmpty()) {
                                for (Object raObj : roleAssignmentsList) {
                                    RoleAssignment roleAssignment = (RoleAssignment) raObj;
                                    List permittedRoleAssignments = roleAssignment.getPermittedRoleAssignments();
                                    
                                    if (permittedRoleAssignments != null && !permittedRoleAssignments.isEmpty()) {
                                        for (Object praObj : permittedRoleAssignments) {
                                            RoleAssignment permittedRoleAssignment = (RoleAssignment) praObj;
                                            if (permittedRoleAssignment.getRoleName().equalsIgnoreCase(roleName)) {
                                                parentBundle = roleAssignment.getRoleName();
                                                break;
                                            }
                                        }
                                    }
                                    if (!"".equals(parentBundle)) {
                                        break;
                                    }
                                }
                            }
                            
                            if (!"".equals(parentBundle)) {
                                attMap.put("permittedBy", parentBundle);
                                attMap.put("assignment", true);
                            }
                            
                            att.putAll(attMap);
                            
                            AttributeRequest attrReq = new AttributeRequest("detectedRoles",
                                    ProvisioningPlan.Operation.Remove, roleName);
                            attrReq.setArgs(att);
                            
                          
                            Provisioner p = new Provisioner(context);
                            ProvisioningPlan newPlan = new ProvisioningPlan();
                            newPlan.setIdentity(identity);
                            p.setOptimisticProvisioning(true);
                            
                            AccountRequest newAcc = new AccountRequest();
                            newAcc.setApplication("IIQ");
                            newAcc.setTargetIntegration("IIQ");
                            newAcc.setNativeIdentity(identity.getName());
                            newAcc.add(attrReq);
                            newAcc.setOperation(ProvisioningPlan.AccountRequest.Operation.Modify);
                            newPlan.add(newAcc);
                            
                            
                            p.execute(newPlan);
                        }
                    }
                }
            }
        }
        

        context.saveObject(identity);
        context.commitTransaction();
        
    } catch (Exception e) {
        log.error("Error in before provisioning rule: " + e.getMessage());
        e.printStackTrace();
    }
}



Hi Harish,

Did you follow the suggestion, and is your issue resolved.

if Yes, please mark the post as solution.