[keycloak-user] RequiredActionProviderEntity priority migration issue

Frederick Ding frederick at frederickding.com
Wed Aug 1 21:39:32 EDT 2018


Another user flagged a similar issue earlier today: 
http://lists.jboss.org/pipermail/keycloak-user/2018-August/014977.html . 
The problem appears to have been introduced in 
https://github.com/keycloak/keycloak/commit/7c0ca9aad2f552c63022010a1fc4bdbd96abab73 
.

The relevant issue in the server log when trying to start up 4.2.0 after 
migrating from 3.4.3 is this:

---
> 21:05:51,751 ERROR [org.jboss.msc.service.fail] (ServerService Thread 
> Pool -- 58) MSC000001: Failed to start service 
> jboss.undertow.deployment.default-server.default-host./auth: 
> org.jboss.msc.service.StartException in service 
> jboss.undertow.deployment.default-server.default-host./auth: 
> java.lang.RuntimeException: RESTEASY003325: Failed to construct public 
> org.keycloak.services.resources.KeycloakApplication(javax.servlet.ServletContext,org.jboss.resteasy.core.Dispatcher)
>         at 
> org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:84)
>         at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
>         at org.jboss.threads.JBossThread.run(JBossThread.java:320)
> Caused by: java.lang.RuntimeException: RESTEASY003325: Failed to 
> construct public 
> org.keycloak.services.resources.KeycloakApplication(javax.servlet.ServletContext,org.jboss.resteasy.core.Dispatcher)
>         at 
> org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:162)
>         at 
> org.jboss.resteasy.spi.ResteasyProviderFactory.createProviderInstance(ResteasyProviderFactory.java:2298)
>         at 
> org.jboss.resteasy.spi.ResteasyDeployment.createApplication(ResteasyDeployment.java:340)
>         at 
> org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:253)
>         at 
> org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:120)
>         at 
> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36)
>         at 
> io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
>         at 
> org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78)
>         at 
> io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)
>         at 
> io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:250)
>         at 
> io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:133)
>         at 
> io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:565)
>         at 
> io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:536)
>         at 
> io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
>         at 
> io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
>         at 
> org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
>         at 
> org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
>         at 
> org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
>         at 
> org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
>         at 
> org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508)
>         at 
> io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:578)
>         at 
> org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)
>         at 
> org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:81)
>         ... 6 more
> Caused by: org.hibernate.PropertyAccessException: Null value was 
> assigned to a property [class 
> org.keycloak.models.jpa.entities.RequiredActionProviderEntity.priority] 
> of primitive type setter of 
> org.keycloak.models.jpa.entities.RequiredActionProviderEntity.priority
>         at 
> org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:44)
>         at 
> org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:713)
>         at 
> org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:207)
>         at 
> org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4692)
>         at 
> org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:183)
>         at 
> org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:125)
>         at 
> org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.performTwoPhaseLoad(AbstractRowReader.java:238)
>         at 
> org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:209)
>         at 
> org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:133)
>         at 
> org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122)
>         at 
> org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86)
>         at 
> org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:88)
>         at 
> org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:688)
>         at 
> org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75)
>         at 
> org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2004)
>         at 
> org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:567)
>         at 
> org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:249)
>         at 
> org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:563)
>         at 
> org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:132)
>         at 
> org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:161)
>         at 
> org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:146)
>         at 
> org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:249)
>         at 
> org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:145)
>         at 
> org.hibernate.collection.internal.PersistentBag.isEmpty(PersistentBag.java:266)
>         at 
> org.keycloak.models.jpa.RealmAdapter.getRequiredActionProviders(RealmAdapter.java:1726)
>         at 
> org.keycloak.models.cache.infinispan.entities.CachedRealm.<init>(CachedRealm.java:256)
>         at 
> org.keycloak.models.cache.infinispan.RealmCacheSession.getRealm(RealmCacheSession.java:399)
>         at 
> org.keycloak.models.jpa.JpaRealmProvider.getRealms(JpaRealmProvider.java:102)
>         at 
> org.keycloak.models.cache.infinispan.RealmCacheSession.getRealms(RealmCacheSession.java:459)
>         at 
> org.keycloak.migration.migrators.MigrateTo3_4_1.migrate(MigrateTo3_4_1.java:40)
>         at 
> org.keycloak.migration.MigrationModelManager.migrate(MigrationModelManager.java:96)
>         at 
> org.keycloak.services.resources.KeycloakApplication.migrateModel(KeycloakApplication.java:245)
>         at 
> org.keycloak.services.resources.KeycloakApplication.migrateAndBootstrap(KeycloakApplication.java:186)
>         at 
> org.keycloak.services.resources.KeycloakApplication$1.run(KeycloakApplication.java:145)
>         at 
> org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:227)
>         at 
> org.keycloak.services.resources.KeycloakApplication.<init>(KeycloakApplication.java:136)
>         at 
> sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>         at 
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
>         at 
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
>         at 
> org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:150)
>         ... 28 more
> Caused by: java.lang.IllegalArgumentException: Can not set int field 
> org.keycloak.models.jpa.entities.RequiredActionProviderEntity.priority 
> to null value
>         at 
> sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
>         at 
> sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
>         at 
> sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:80)
>         at java.lang.reflect.Field.set(Field.java:764)
>         at 
> org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:38)
>         ... 68 more

---

Based on the SQL migration that was generated, it looks like the 
database migration merely added a column without setting a value in that 
column:

---
> -- Changeset 
> META-INF/jpa-changelog-4.2.0.xml::4.2.0-KEYCLOAK-6313::wadahiro at gmail.com
>  ALTER TABLE public.REQUIRED_ACTION_PROVIDER ADD PRIORITY INT;
>
>  INSERT INTO public.databasechangelog (ID, AUTHOR, FILENAME, 
> DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, 
> CONTEXTS, LABELS, LIQUIBASE,                DEPLOYMENT_ID) VALUES 
> ('4.2.0-KEYCLOAK-6313', 'wadahiro at gmail.com', 
> 'META-INF/jpa-changelog-4.2.0.xml', NOW(), 67, 
> '7:14d407c35bc4fe1976867756bcea0c36', 'addColumn 
> tableName=REQUIRED_ACTION_PROVIDER', '', 'EXECUTED', NULL, NULL, 
> '3.5.4', '3171859373');

---

When starting up, the migrator 
(https://github.com/keycloak/keycloak/blob/7c0ca9aad2f552c63022010a1fc4bdbd96abab73/server-spi-private/src/main/java/org/keycloak/migration/migrators/MigrateTo4_2_0.java) 
that sets the default priority to 10 hasn't yet run. Meanwhile, the new 
database column contains a null field for each row, which causes the 
initialization to fail on server startup.

Has anyone else experienced this?

Frederick


More information about the keycloak-user mailing list