From 35511aa9005c0d470f65d9849872f52a2099c313 Mon Sep 17 00:00:00 2001 From: Garth <244253+xgp@users.noreply.github.com> Date: Wed, 26 Jul 2023 21:52:03 +0200 Subject: [PATCH] trying commitImpl in a new transaction, even though this should be run in the existing one. (#35) --- .../events/UserEventListenerProviderFactory.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/phasetwo/keycloak/events/UserEventListenerProviderFactory.java b/src/main/java/io/phasetwo/keycloak/events/UserEventListenerProviderFactory.java index fc5ff48..e7d6771 100644 --- a/src/main/java/io/phasetwo/keycloak/events/UserEventListenerProviderFactory.java +++ b/src/main/java/io/phasetwo/keycloak/events/UserEventListenerProviderFactory.java @@ -12,6 +12,7 @@ import org.keycloak.models.KeycloakSessionFactory; import org.keycloak.models.RealmModel; import org.keycloak.models.UserModel; +import org.keycloak.models.utils.KeycloakModelUtils; /** * User added/removed listener base class. Just provide a user add/remove handler. Inspired by @@ -22,6 +23,8 @@ public abstract class UserEventListenerProviderFactory extends AbstractEventListenerProviderFactory { + private KeycloakSessionFactory factory; + @Override public EventListenerProvider create(KeycloakSession session) { return new AbstractEventListenerProvider() { @@ -53,9 +56,13 @@ void userAdded(String realmId, String userId) { new AbstractKeycloakTransaction() { @Override protected void commitImpl() { - RealmModel realm = session.realms().getRealm(realmId); - UserModel user = session.users().getUserById(realm, userId); - getUserChangedHandler().onUserAdded(session, realm, user); + KeycloakModelUtils.runJobInTransaction( + factory, + (s) -> { + RealmModel realm = s.realms().getRealm(realmId); + UserModel user = s.users().getUserById(realm, userId); + getUserChangedHandler().onUserAdded(s, realm, user); + }); } @Override @@ -75,6 +82,7 @@ abstract class UserChangedHandler { @Override public void postInit(KeycloakSessionFactory factory) { + this.factory = factory; factory.register( (event) -> { if (event instanceof UserModel.UserRemovedEvent) {