Which IIQ version are you inquiring about?
8.2
Please share any images or screenshots, if relevant.
<?xml version='1.0' encoding='UTF-8'?>
import sailpoint.object.*;
import sailpoint.object.Identity;
import sailpoint.object.ManagedAttribute;
import sailpoint.object.QueryOptions;
import sailpoint.object.Filter;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.Workflow.ApprovalItem;
import sailpoint.object.ApprovalSet;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.log4j.Logger;
// 1. Helper Method to create Approval Object
Approval createApproval(Identity owner, String desc, ApprovalSet set) {
if (owner == null) return null;
Approval a = new Approval();
a.setOwner(owner);
a.setMode("Serial");
a.setDescription(desc);
a.setApprovalSet(set);
return a;
}
// 2. Helper Method to find Identity by Employee Number (Optimized)
Identity getIdentityByEmpNo(String empNo) {
if (empNo == null || empNo.isEmpty()) return null;
// Using context from the global namespace (passed automatically when referenced)
return context.getUniqueObject(Identity.class, Filter.eq(“employeeNumber”, empNo));
}
Logger logger = Logger.getLogger(“NBE.EIAM.ApprovalRule”);
List approvals = new ArrayList();
Set addedApprovers = new HashSet();
try {
Identity requester = context.getObjectByName(Identity.class, identityName);
if (requester == null) return approvals;
String description = "Access Request Approval for: " + identityName;
String empType = (String) requester.getAttribute("emptype");
// 1. Direct Manager
Identity manager = requester.getManager();
if (manager != null && !addedApprovers.contains(manager.getName())) {
// Now calling createApproval directly from the Library
Approval app = createApproval(manager, description, approvalSet);
if (app != null) {
approvals.add(app);
addedApprovers.add(manager.getName());
}
}
// 2. Hierarchy Logic (Branches vs. HQ)
if ("Branches".equalsIgnoreCase(empType)) {
Identity branchMgr = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
if (branchMgr != null && !addedApprovers.contains(branchMgr.getName())) {
Approval app = createApproval(branchMgr, description, approvalSet);
approvals.add(app);
addedApprovers.add(branchMgr.getName());
}
String areaName = (String) requester.getAttribute("regionName");
Identity areaMgr = context.getUniqueObject(Identity.class, Filter.eq("name", areaName));
if (areaMgr != null && !addedApprovers.contains(areaMgr.getName())) {
Approval app = createApproval(areaMgr, description, approvalSet);
approvals.add(app);
addedApprovers.add(areaMgr.getName());
}
} else if ("Head Office".equalsIgnoreCase(empType)) {
Identity gmApprover = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
if (gmApprover != null && !addedApprovers.contains(gmApprover.getName())) {
Approval app = createApproval(gmApprover, description, approvalSet);
approvals.add(app);
addedApprovers.add(gmApprover.getName());
}
Identity groupHead = getIdentityByEmpNo((String) requester.getAttribute("secondlineApprover"));
if (groupHead != null && !addedApprovers.contains(groupHead.getName())) {
Approval app = createApproval(groupHead, description, approvalSet);
approvals.add(app);
addedApprovers.add(groupHead.getName());
}
}
// 3. Optional Workgroup Levels
for (ApprovalItem item : approvalSet.getItems()) {
QueryOptions maQo = new QueryOptions();
maQo.addFilter(Filter.eq("application.name", item.getApplicationName()));
maQo.addFilter(Filter.eq("value", item.getValue()));
Iterator it = context.search(ManagedAttribute.class, maQo);
ManagedAttribute ma = null;
if (it.hasNext()) {
ma = (ManagedAttribute) it.next();
}
sailpoint.tools.Util.flushIterator(it);
if (ma != null) {
for (int i = 1; i <= 4; i++) {
String wgName = (String) ma.getAttribute("workgroupLevel" + i);
if (wgName != null && !wgName.isEmpty()) {
Identity workgroup = context.getUniqueObject(Identity.class, Filter.eq("name", wgName));
if (workgroup != null && !addedApprovers.contains(workgroup.getName())) {
Approval app = createApproval(workgroup, description, approvalSet);
approvals.add(app);
addedApprovers.add(workgroup.getName());
}
}
}
}
}
} catch (Exception e) {
logger.error("EIAM Approval Rule Failure: " + e.getMessage());
}
return approvals;
Share all details about your problem, including any error messages you may have received.
An unexpected error occurred: BeanShell script error: bsh.EvalError: Sourced file: inline evaluation of: ``import sailpoint.object.*; import sailpoint.object.Identity; import sailpoint.ob . . . ‘’ : Typed variable declaration : Error in method invocation: Method setOwner(sailpoint.object.Identity$HibernateProxy$YPxDfpk3) not found in class’sailpoint.object.Workflow$Approval’ : at Line: 22 : in file: inline evaluation of: ``import sailpoint.object.*; import sailpoint.object.Identity; import sailpoint.ob . . . ‘’ : a .setOwner ( owner ) Called from method: createApproval : at Line: 51 : in file: inline evaluation of: ``import sailpoint.object.*; import sailpoint.object.Identity; import sailpoint.ob . . . ‘’ : createApproval ( manager , description , approvalSet ) BSF info: NBE_EIAM_Approval_Rule at line: 0 column: columnNo
An unexpected error occurred: BeanShell script error: bsh.EvalError: Sourced file: inline evaluation of: ``import sailpoint.object.Identity; import sailpoint.object.Filter; import sailpoi . . . ‘’ : Class: Approval not found in namespace : at Line: 9 : in file: inline evaluation of: ``import sailpoint.object.Identity; import sailpoint.object.Filter; import sailpoi . . . ‘’ : Approval BSF info: NBE_EIAM_Library at line: 0 column: columnNo
need help in this PlS
@ismaelmoreno1 can you pls help me with this
shirbhatea
(Ankush Shirbhate)
January 22, 2026, 11:53am
3
NBE_EIAM_Library missing
import sailpoint.object.Workflow.Approval;
i did that still get same error
shirbhatea
(Ankush Shirbhate)
January 22, 2026, 12:37pm
5
can you share the both xml here for better visibility?
You are trying to use the setOwner method, but this method is not available in the Approval class. Please check the error message, it clearly indicates that this method does not exist in that class.
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Rule language="beanshell" name="NBE_EIAM_Approval_Rule" type="Workflow">
<Source>
import sailpoint.object.*;
import sailpoint.object.Identity;
import sailpoint.object.ManagedAttribute;
import sailpoint.object.QueryOptions;
import sailpoint.object.Filter;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.Workflow.ApprovalItem;
import sailpoint.object.ApprovalSet;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.log4j.Logger;
// 1. Helper Method to create Approval Object
Approval createApproval(Identity owner, String desc, ApprovalSet set) {
if (owner == null) return null;
Approval a = new Approval();
a.setOwner(owner);
a.setMode("Serial");
a.setDescription(desc);
a.setApprovalSet(set);
return a;
}
// 2. Helper Method to find Identity by Employee Number (Optimized)
Identity getIdentityByEmpNo(String empNo) {
if (empNo == null || empNo.isEmpty()) return null;
// Using context from the global namespace (passed automatically when referenced)
return context.getUniqueObject(Identity.class, Filter.eq("employeeNumber", empNo));
}
Logger logger = Logger.getLogger("NBE.EIAM.ApprovalRule");
List approvals = new ArrayList();
Set addedApprovers = new HashSet();
try {
Identity requester = context.getObjectByName(Identity.class, identityName);
if (requester == null) return approvals;
String description = "Access Request Approval for: " + identityName;
String empType = (String) requester.getAttribute("emptype");
// 1. Direct Manager
Identity manager = requester.getManager();
if (manager != null && !addedApprovers.contains(manager.getName())) {
// Now calling createApproval directly from the Library
Approval app = createApproval(manager, description, approvalSet);
if (app != null) {
approvals.add(app);
addedApprovers.add(manager.getName());
}
}
// 2. Hierarchy Logic (Branches vs. HQ)
if ("Branches".equalsIgnoreCase(empType)) {
Identity branchMgr = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
if (branchMgr != null && !addedApprovers.contains(branchMgr.getName())) {
Approval app = createApproval(branchMgr, description, approvalSet);
approvals.add(app);
addedApprovers.add(branchMgr.getName());
}
String areaName = (String) requester.getAttribute("regionName");
Identity areaMgr = context.getUniqueObject(Identity.class, Filter.eq("name", areaName));
if (areaMgr != null && !addedApprovers.contains(areaMgr.getName())) {
Approval app = createApproval(areaMgr, description, approvalSet);
approvals.add(app);
addedApprovers.add(areaMgr.getName());
}
} else if ("Head Office".equalsIgnoreCase(empType)) {
Identity gmApprover = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
if (gmApprover != null && !addedApprovers.contains(gmApprover.getName())) {
Approval app = createApproval(gmApprover, description, approvalSet);
approvals.add(app);
addedApprovers.add(gmApprover.getName());
}
Identity groupHead = getIdentityByEmpNo((String) requester.getAttribute("secondlineApprover"));
if (groupHead != null && !addedApprovers.contains(groupHead.getName())) {
Approval app = createApproval(groupHead, description, approvalSet);
approvals.add(app);
addedApprovers.add(groupHead.getName());
}
}
// 3. Optional Workgroup Levels
for (ApprovalItem item : approvalSet.getItems()) {
QueryOptions maQo = new QueryOptions();
maQo.addFilter(Filter.eq("application.name", item.getApplicationName()));
maQo.addFilter(Filter.eq("value", item.getValue()));
Iterator it = context.search(ManagedAttribute.class, maQo);
ManagedAttribute ma = null;
if (it.hasNext()) {
ma = (ManagedAttribute) it.next();
}
sailpoint.tools.Util.flushIterator(it);
if (ma != null) {
for (int i = 1; i <= 4; i++) {
String wgName = (String) ma.getAttribute("workgroupLevel" + i);
if (wgName != null && !wgName.isEmpty()) {
Identity workgroup = context.getUniqueObject(Identity.class, Filter.eq("name", wgName));
if (workgroup != null && !addedApprovers.contains(workgroup.getName())) {
Approval app = createApproval(workgroup, description, approvalSet);
approvals.add(app);
addedApprovers.add(workgroup.getName());
}
}
}
}
}
} catch (Exception e) {
logger.error("EIAM Approval Rule Failure: " + e.getMessage());
}
return approvals;
</Source>
</Rule>
what should i use instead of it
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Rule language="beanshell" name="NBE_EIAM_Approval_Rule" type="Workflow">
<Source>
import sailpoint.object.*;
import sailpoint.object.Identity;
import sailpoint.object.ManagedAttribute;
import sailpoint.object.QueryOptions;
import sailpoint.object.Filter;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.Workflow.ApprovalItem;
import sailpoint.object.ApprovalSet;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.log4j.Logger;
// 1. Helper Method to create Approval Object
Approval createApproval(Identity owner, String desc, ApprovalSet set) {
if (owner == null) return null;
Approval a = new Approval();
a.setOwner(owner);
a.setMode("Serial");
a.setDescription(desc);
a.setApprovalSet(set);
return a;
}
// 2. Helper Method to find Identity by Employee Number (Optimized)
Identity getIdentityByEmpNo(String empNo) {
if (empNo == null || empNo.isEmpty()) return null;
// Using context from the global namespace (passed automatically when referenced)
return context.getUniqueObject(Identity.class, Filter.eq("employeeNumber", empNo));
}
Logger logger = Logger.getLogger("NBE.EIAM.ApprovalRule");
List approvals = new ArrayList();
Set addedApprovers = new HashSet();
try {
Identity requester = context.getObjectByName(Identity.class, identityName);
if (requester == null) return approvals;
String description = "Access Request Approval for: " + identityName;
String empType = (String) requester.getAttribute("emptype");
// 1. Direct Manager
Identity manager = requester.getManager();
if (manager != null && !addedApprovers.contains(manager.getName())) {
// Now calling createApproval directly from the Library
Approval app = createApproval(manager, description, approvalSet);
if (app != null) {
approvals.add(app);
addedApprovers.add(manager.getName());
}
}
// 2. Hierarchy Logic (Branches vs. HQ)
if ("Branches".equalsIgnoreCase(empType)) {
Identity branchMgr = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
if (branchMgr != null && !addedApprovers.contains(branchMgr.getName())) {
Approval app = createApproval(branchMgr, description, approvalSet);
approvals.add(app);
addedApprovers.add(branchMgr.getName());
}
String areaName = (String) requester.getAttribute("regionName");
Identity areaMgr = context.getUniqueObject(Identity.class, Filter.eq("name", areaName));
if (areaMgr != null && !addedApprovers.contains(areaMgr.getName())) {
Approval app = createApproval(areaMgr, description, approvalSet);
approvals.add(app);
addedApprovers.add(areaMgr.getName());
}
} else if ("Head Office".equalsIgnoreCase(empType)) {
Identity gmApprover = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
if (gmApprover != null && !addedApprovers.contains(gmApprover.getName())) {
Approval app = createApproval(gmApprover, description, approvalSet);
approvals.add(app);
addedApprovers.add(gmApprover.getName());
}
Identity groupHead = getIdentityByEmpNo((String) requester.getAttribute("secondlineApprover"));
if (groupHead != null && !addedApprovers.contains(groupHead.getName())) {
Approval app = createApproval(groupHead, description, approvalSet);
approvals.add(app);
addedApprovers.add(groupHead.getName());
}
}
// 3. Optional Workgroup Levels
for (ApprovalItem item : approvalSet.getItems()) {
QueryOptions maQo = new QueryOptions();
maQo.addFilter(Filter.eq("application.name", item.getApplicationName()));
maQo.addFilter(Filter.eq("value", item.getValue()));
Iterator it = context.search(ManagedAttribute.class, maQo);
ManagedAttribute ma = null;
if (it.hasNext()) {
ma = (ManagedAttribute) it.next();
}
sailpoint.tools.Util.flushIterator(it);
if (ma != null) {
for (int i = 1; i <= 4; i++) {
String wgName = (String) ma.getAttribute("workgroupLevel" + i);
if (wgName != null && !wgName.isEmpty()) {
Identity workgroup = context.getUniqueObject(Identity.class, Filter.eq("name", wgName));
if (workgroup != null && !addedApprovers.contains(workgroup.getName())) {
Approval app = createApproval(workgroup, description, approvalSet);
approvals.add(app);
addedApprovers.add(workgroup.getName());
}
}
}
}
}
} catch (Exception e) {
logger.error("EIAM Approval Rule Failure: " + e.getMessage());
}
return approvals;
</Source>
</Rule>
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Rule language="beanshell" name="NBE_EIAM_Approval_Rule" type="Workflow">
<Source>
import sailpoint.object.*;
import sailpoint.object.Identity;
import sailpoint.object.ManagedAttribute;
import sailpoint.object.QueryOptions;
import sailpoint.object.Filter;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.Workflow.ApprovalItem;
import sailpoint.object.ApprovalSet;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import org.apache.log4j.Logger;
// 1. Helper Method to create Approval Object
Approval createApproval(Identity owner, String desc, ApprovalSet set) {
if (owner == null) return null;
Approval a = new Approval();
a.setOwner(owner);
a.setMode("Serial");
a.setDescription(desc);
a.setApprovalSet(set);
return a;
}
// 2. Helper Method to find Identity by Employee Number (Optimized)
Identity getIdentityByEmpNo(String empNo) {
if (empNo == null || empNo.isEmpty()) return null;
// Using context from the global namespace (passed automatically when referenced)
return context.getUniqueObject(Identity.class, Filter.eq("employeeNumber", empNo));
}
Logger logger = Logger.getLogger("NBE.EIAM.ApprovalRule");
List approvals = new ArrayList();
Set addedApprovers = new HashSet();
try {
Identity requester = context.getObjectByName(Identity.class, identityName);
if (requester == null) return approvals;
String description = "Access Request Approval for: " + identityName;
String empType = (String) requester.getAttribute("emptype");
// 1. Direct Manager
Identity manager = requester.getManager();
if (manager != null && !addedApprovers.contains(manager.getName())) {
// Now calling createApproval directly from the Library
Approval app = createApproval(manager, description, approvalSet);
if (app != null) {
approvals.add(app);
addedApprovers.add(manager.getName());
}
}
// 2. Hierarchy Logic (Branches vs. HQ)
if ("Branches".equalsIgnoreCase(empType)) {
Identity branchMgr = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
if (branchMgr != null && !addedApprovers.contains(branchMgr.getName())) {
Approval app = createApproval(branchMgr, description, approvalSet);
approvals.add(app);
addedApprovers.add(branchMgr.getName());
}
String areaName = (String) requester.getAttribute("regionName");
Identity areaMgr = context.getUniqueObject(Identity.class, Filter.eq("name", areaName));
if (areaMgr != null && !addedApprovers.contains(areaMgr.getName())) {
Approval app = createApproval(areaMgr, description, approvalSet);
approvals.add(app);
addedApprovers.add(areaMgr.getName());
}
} else if ("Head Office".equalsIgnoreCase(empType)) {
Identity gmApprover = getIdentityByEmpNo((String) requester.getAttribute("firstlineApprover"));
if (gmApprover != null && !addedApprovers.contains(gmApprover.getName())) {
Approval app = createApproval(gmApprover, description, approvalSet);
approvals.add(app);
addedApprovers.add(gmApprover.getName());
}
Identity groupHead = getIdentityByEmpNo((String) requester.getAttribute("secondlineApprover"));
if (groupHead != null && !addedApprovers.contains(groupHead.getName())) {
Approval app = createApproval(groupHead, description, approvalSet);
approvals.add(app);
addedApprovers.add(groupHead.getName());
}
}
// 3. Optional Workgroup Levels
for (ApprovalItem item : approvalSet.getItems()) {
QueryOptions maQo = new QueryOptions();
maQo.addFilter(Filter.eq("application.name", item.getApplicationName()));
maQo.addFilter(Filter.eq("value", item.getValue()));
Iterator it = context.search(ManagedAttribute.class, maQo);
ManagedAttribute ma = null;
if (it.hasNext()) {
ma = (ManagedAttribute) it.next();
}
sailpoint.tools.Util.flushIterator(it);
if (ma != null) {
for (int i = 1; i <= 4; i++) {
String wgName = (String) ma.getAttribute("workgroupLevel" + i);
if (wgName != null && !wgName.isEmpty()) {
Identity workgroup = context.getUniqueObject(Identity.class, Filter.eq("name", wgName));
if (workgroup != null && !addedApprovers.contains(workgroup.getName())) {
Approval app = createApproval(workgroup, description, approvalSet);
approvals.add(app);
addedApprovers.add(workgroup.getName());
}
}
}
}
}
} catch (Exception e) {
logger.error("EIAM Approval Rule Failure: " + e.getMessage());
}
return approvals;
</Source>
</Rule>
shirbhatea
(Ankush Shirbhate)
January 22, 2026, 1:43pm
11
use the below one
a.setOwner(owner.getName());
This method expect the string object but you are trying to push the identity object.
Regards
Ankush
how can i solve this issus ?
Hi, @Aniso13Cyber ,
Are you still seeing the same error?
Workflow.Approval objects are only processed by IdentityIQ when they are returned from an ApprovalAssignment rule . When the same logic runs inside a Workflow rule, IIQ does not honor Workflow.Approval, which results in the runtime errors you’re encountering (including setOwner errors).
I recommend moving the approval-creation logic to an ApprovalAssignment rule , returning the Workflow.Approval objects from there, and then referencing that rule in your workflow.
Hope this helps.
Hi @Aniso13Cyber ,
Use approvalAssignment rule to set multi approvers.
Example:
import java.util.List;
import sailpoint.object.Workflow.Approval;
import sailpoint.object.ApprovalSet;
import sailpoint.object.ApprovalItem;
import sailpoint.object.Custom;
import sailpoint.object.Identity;
log.warn(“Enter into the Approval Assignment Rule ******”);
log.warn("Identity name is : " + identityName);
Identity idn = context.getObjectByName(Identity.class,identityName);
String displayName = idn.getDisplayName();
log.warn("Display Name is : "+ displayName);
for(Approval approval : approvals){
log.warn("Approval in list : " + approval.toString());
}
log.warn("Approval set is : "+ approvalSet.toString());
List newApprovals = new ArrayList();
if( Approvals != null) {
newApprovals.addAll(approvals);
}
if(approvalSet != null){
String secondLevelApprover = “xyz“;
Approval secondLevel = new Approval();
secondLevel .setOwner(secondLevelApprover );
secondLevel .setDescription("Identity Approval - Account Changes for User: " + displayName);
newApprovals.add(secondLevel );
log.warn("New approval are : " + newApprovals);
return newApprovals;
system
(system)
Closed
March 27, 2026, 12:34pm
15
This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.