We have created a custom workflow in IdentityIQ (version 8.1) for testing purposes. The workflow is triggered via a QuickLink that includes a form with a dynamic identity selection (type="sailpoint.object.Identity"). The workflow and QuickLink both function correctly for administrator users (such as spadmin), but when accessed by a standard user, the following error occurs on QuickLink launch:
javax.faces.FacesException: #{quickLinks.chooseQuickLink}: java.lang.NullPointerException
at sailpoint.service.quicklink.QuickLinkLauncher.validateQuickLink(QuickLinkLauncher.java:540)
Technical details of our configuration:
QuickLink includes forceAllowOthers=true, allowSelf=true, and allowOther=true
A DynamicScope named TEST4 is linked and includes allowAll="true" and <PopulationScript>return true;</PopulationScript>
The form and workflow contain a variable named identityName that is dynamic and required in the form
The workflow includes an OwnerScript, but even when completely removed, the error persists
All users have a capability assigned (e.g., Identity Administrator)
There are no apparent errors in the XML structure or workflow logic
This issue only occurs for non-admin users. For admins, the QuickLink loads and launches the workflow as expected
This appears to be a failure during the validateQuickLink() authorization phase, and we have not been able to resolve it through configuration or code changes.
Version: IdentityIQ 8.1 Impact: QuickLink-based workflow functionality is unavailable for business users
We would appreciate your assistance in identifying the root cause and advising on how to resolve this issue.
Welcome to the community . It seems to be issue related to Dynamic scope . Can you try below dynamic scope just for testing purpose and put your users whom you want to test. if it works then we can further optimize the dynamic scope as per your requirement .
You may want to query spt_quicklink_options and look for any null quicklinks and if so delete those rows. This happens sometimes if you edit the dynamic scopes in the debug page.
Thank you very much for your support.
We have applied the changes based on the dynamic scope configuration you shared with us; however, we are still encountering the same warning.
Below, you can find the updated dynamic scope definition along with a screenshot for your reference:
Hi @eozaltun , Alright . Lets wait if anybody have any other idea , otherwise check in which class you are getting the error , and Lets enable the log for that class . it might give some idea about what is exactly going on . Also you mentioned method in your post . import the identityiq api in any IDE whatever you are using or decompile the classes , and go to that method and see what is there . Keep us in loop , we will figure something out .
Did you try my suggestion?
You may want to query spt_quick_link_options and look for any null quick_link and if so delete those rows. This happens sometimes if you edit the dynamic scopes in the debug page.
delete from spt_quick_link_options where quick_link is null;
Hi,
First of all, thank you for informing me. I do not have direct access to the database.
Before executing this query, is there any area in the debug pages or on the server side where I can check or investigate this issue further?
Thanks again in advance for your help and support!
Additionally, while reviewing the logs, I noticed the following error message: “2025-08-04T11:47:35,958 ERROR https-jsse-nio-443-exec-16 sailpoint.web.util.SailPointActionListener:44 - Caught unhandled JSF exception: #{quickLinks.chooseQuickLink}: java.lang.NullPointerException
javax.faces.FacesException: #{quickLinks.chooseQuickLink}: java.lang.NullPointerException”
I’m not sure if it’s directly related, but I wanted to share it with you in case it might help with the investigation.
You can write beanshell script to check if there are any null quick links. Below is the reference code.
Filter filter = Filter.isnull("quickLink");
QueryOptions options = new QueryOptions();
options.addFilter(filter);
List qlToDelete = new ArrayList();
Iterator iterator = context.search(QuickLinkOptions.class, options, Arrays.asList("id"));
while (iterator.hasNext()) {
String id = (String) ((Object[]) iterator.next())[0];
qlToDelete.add(id);
}
Terminator terminator = new Terminator(context);
if (!qlToDelete.isEmpty()) {
Filter f = Filter.in("id", qlToDelete);
QueryOptions ops = new QueryOptions();
ops.addFilter(f);
terminator.deleteObjects(QuickLinkOptions.class, ops);
}
int count = context.countObjects(QuickLinkOptions.class, options); // if count is morethan 0 then still quick links are not deleted which has null
return count;
First of all, I would like to sincerely thank everyone for your support — the issue has been resolved. Thanks to the suggestions you shared, I not only discovered new aspects of the system but also gained a better understanding of the root cause of the problem. I’d be more than happy to assist any of you in the future if you ever face a situation.
A special thanks to @phodgdon — your suggestion was exactly what we needed. We executed the following command on the database:
delete from spt_quick_link_options where quick_link is null;
After removing the null quick links, the form became visible to other users as expected.
Ya anytime you edit a dynamic scope in the debug page, particularly adding or removing the hibernate doesn’t persist the changes properly. Always make changes in the QuickLink population page of via the SSB.