Refresh on-demand from plugin code

Which IIQ version are you inquiring about?

8.4p2

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

I have written a plugin places a refresh button on the identity page, and I’m trying to use the sailpoint.api.Identitizer class to do the refresh when I click the button like so:

Attributes<String, Object> options = new Attributes<>();
options.put("promoteAttributes", "true");
options.put("provision", "true");
options.put("correlateEntitlements", "true");
options.put("processTriggers", "true");
options.put("synchronizeAttributes", "true");
options.put("refreshProvisioningRequests", "true");
options.put("refreshManagerStatus", "true");
options.put("refreshIdentityEntitlements", "true");
options.put(Identitizer.ARG_REFRESH_SOURCE, "webservice");
options.put(Identitizer.ARG_REFRESH_SOURCE_WHO, loggedInUser.getName());

var target = context.getObject(Identity.class, identityId);

Identitizer identitizer = new Identitizer(context, options);
identitizer.refresh(identity);

I get the error:
failed to lazily initialize a collection of role: sailpoint.object.Rule.referencedRules, could not initialize proxy - no Session

If I set the promoteAttributes and provision to false I don’t get the error.

Thank you
Michael

The root cause is object identity/session mismatch, not the refresh options themselves — promoteAttributes/provision just happen to be the options that trigger rule execution , so they’re the first ones to surface a stale-context problem that already existed.

Looking at your code, i can see you fetch target via context.getObject(Identity.class, identityId), but then call identitizer.refresh(identity) — a different object reference. If identity was loaded earlier , it’s detached from the current Hibernate session. Identitizer works fine for simple field updates on a detached-ish object, but as soon as a rule needs to lazy-load referencedRules, Hibernate has no session to fetch through → the exact error you’re seeing.

update these line in yori code

Identity target = context.getObject(Identity.class, identityId);

Identitizer identitizer = new Identitizer(context, options);
identitizer.refresh(target);   // refresh the object you just loaded, not a stale reference

context.decache(target)

@mlf11

Please use the below line of code in your existing code.

Identity target = context.getObjectById(Identity.class, identityId);

try {
    Identitizer identitizer = new Identitizer(context, options);
    identitizer.refresh(target);
} finally {
    context.decache(target);
}

Hi Naveen, thankyou for answering my post.

The identitizer.refresh(identity) was a typo on my account, when trying your example the context.decache(target) is never reached, the exception is thrown beforehand:

// ... 
Identity target = context.getObject(Identity.class, identityId);

Identitizer identitizer = new Identitizer(context, options);
identitizer.refresh(target);   // the code throws here

context.decache(target) // and thus, never reaches here

What baffels me is the “… no session” part of the error, i’m on the identity cubs page http://.../iiq/define/identity/identity.jsf?id=...

One would think that a session exists.

Do you gets any error, can you share me the logs?? we can see where it is failing…

This is the complete log entries:

2026-08-14T09:09:29,883 ERROR http-nio-8080-exec-3 dk.andel.rest.RefreshResource:28 - Error refreshing identity for type: full and targetId: 0a5800029aa61f46819aa6649b361e22
sailpoint.tools.GeneralException: failed to lazily initialize a collection of role: sailpoint.object.Rule.referencedRules, could not initialize proxy - no Session
        at sailpoint.server.BSFRuleRunner.runRule(BSFRuleRunner.java:226) ~[identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at sailpoint.server.InternalContext.runRule(InternalContext.java:1315) ~[identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at sailpoint.server.InternalContext.runRule(InternalContext.java:1287) ~[identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at sailpoint.api.Identitizer.promoteAttribute(Identitizer.java:3963) ~[identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at sailpoint.api.Identitizer.promoteAttributes(Identitizer.java:3773) ~[identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at sailpoint.api.Identitizer.refresh(Identitizer.java:2325) ~[identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at dk.andel.rest.RefreshService.RefreshIdentity(RefreshService.java:94) ~[?:?]
        at dk.andel.rest.RefreshResource.handleRefreshRequest(RefreshResource.java:24) ~[?:?]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:?]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:?]
        at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52) ~[jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:124) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:167) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:79) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:475) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:397) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:255) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248) [jersey-common-2.35.jar:?]
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244) [jersey-common-2.35.jar:?]
        at org.glassfish.jersey.internal.Errors.process(Errors.java:292) [jersey-common-2.35.jar:?]
        at org.glassfish.jersey.internal.Errors.process(Errors.java:274) [jersey-common-2.35.jar:?]
        at org.glassfish.jersey.internal.Errors.process(Errors.java:244) [jersey-common-2.35.jar:?]
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265) [jersey-common-2.35.jar:?]
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:234) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684) [jersey-server-2.35.jar:?]
        at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394) [jersey-container-servlet-core-2.35.jar:?]
        at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346) [jersey-container-servlet-core-2.35.jar:?]
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366) [jersey-container-servlet-core-2.35.jar:?]
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:319) [jersey-container-servlet-core-2.35.jar:?]
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205) [jersey-container-servlet-core-2.35.jar:?]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:197) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) [tomcat-websocket.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at sailpoint.web.SailPointResponseFilter.doFilter(SailPointResponseFilter.java:88) [identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at sailpoint.rest.jaxrs.MethodOverrideFilter.doFilter(MethodOverrideFilter.java:90) [identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at sailpoint.rest.RestCsrfValidationFilter.doFilter(RestCsrfValidationFilter.java:71) [identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at sailpoint.rest.AuthenticationFilter.doFilter(AuthenticationFilter.java:109) [identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at sailpoint.web.SailPointContextRequestFilter.doFilter(SailPointContextRequestFilter.java:68) [identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at sailpoint.web.SailPointPollingRequestFilter.doFilter(SailPointPollingRequestFilter.java:151) [identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at sailpoint.web.ResponseHeaderFilter.doFilter(ResponseHeaderFilter.java:63) [identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.2.24.RELEASE.jar:5.2.24.RELEASE]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.24.RELEASE.jar:5.2.24.RELEASE]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:142) [catalina.jar:9.0.111]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166) [catalina.jar:9.0.111]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:88) [catalina.jar:9.0.111]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) [catalina.jar:9.0.111]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) [catalina.jar:9.0.111]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) [catalina.jar:9.0.111]
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:643) [catalina.jar:9.0.111]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) [catalina.jar:9.0.111]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) [catalina.jar:9.0.111]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) [tomcat-coyote.jar:9.0.111]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) [tomcat-coyote.jar:9.0.111]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:935) [tomcat-coyote.jar:9.0.111]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1831) [tomcat-coyote.jar:9.0.111]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) [tomcat-coyote.jar:9.0.111]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:973) [tomcat-util.jar:9.0.111]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:491) [tomcat-util.jar:9.0.111]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) [tomcat-util.jar:9.0.111]
        at java.lang.Thread.run(Unknown Source) [?:?]
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: sailpoint.object.Rule.referencedRules, could not initialize proxy - no Session
        at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:606) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
        at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:218) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
        at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
        at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
        at org.hibernate.collection.internal.PersistentList.iterator(PersistentList.java:155) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
        at sailpoint.server.BSFRuleRunner.runRule(BSFRuleRunner.java:204) ~[identityiq.jar:8.4p2 Build a559eb467b2-20241211-210440]
        ... 80 more

It works not, but I have no idea why. I changed this:

Identitizer identitizer = new Identitizer(context, options);
identitizer.refresh(target);

to:

new Identitizer(context, options).refresh(target)

Which makes no sense.

hi @mlf11 i will suggest go with taskmanager api,

https://community.sailpoint.com/t5/IdentityIQ-Wiki/Running-a-task-from-a-rule-or-workflow/ta-p/71547

please find document , this will help these lazy error mostly. as we are using native sailpoint functionality. No need to worry about any thing , like lock identity , decache etc.

can you try below and see if it fixes your error

public void refreshIdentity(String identityId) throws GeneralException {
    SailPointContext context = SailPointFactory.getCurrentContext();

    Attributes<String, Object> options = new Attributes<>();
    options.put("promoteAttributes", "true");
    options.put("provision", "true");
    options.put("correlateEntitlements", "true");
    options.put("processTriggers", "true");
    options.put("synchronizeAttributes", "true");
    options.put("refreshProvisioningRequests", "true");
    options.put("refreshManagerStatus", "true");
    options.put("refreshIdentityEntitlements", "true");
    options.put(Identitizer.ARG_REFRESH_SOURCE, "webservice");
    options.put(Identitizer.ARG_REFRESH_SOURCE_WHO, loggedInUser.getName());

    Identity target = context.getObject(Identity.class, identityId);

    Identitizer identitizer = new Identitizer(context, options);
    identitizer.refresh(target);

    context.decache(target);
}

@mlf11 I have created a similar plugin and placed it in the identity warehouse. It is working fine for me. In case above suggestions doesn’t work or you need any clarifications, please ping me over chat. We can discuss and troubleshoot.