Creating users during startup with IdentityManager.createUser()
karypid Jul 12, 2009 10:36 AMHello,
I want to create default user accounts (admin/admin, guest/guest) during the startup of my Seam 2.1.2 application. I need to do this with IdentityManager.createUser() because I use a hashed jpaIdentityStore, so I don't want to have to calculate hashes/update import.sql if I change the hashing approach (one point to modify - the hash annotation - and everything works). Here's the code:
@Stateful @Name("applicationConfiguration") @Scope(ScopeType.APPLICATION) @BypassInterceptors public class ApplicationConfigurationBean implements ApplicationConfiguration { @Observer("org.jboss.seam.postInitialization") public void initializeApplication() { System.out.println("=== APPLICATION STARTUP ==="); System.out.println("Disable security..."); Identity.setSecurityEnabled(false); try { System.out.println("Create context..."); Lifecycle.beginCall(); try { System.out.println("Creating default user accounts..."); IdentityManager im = IdentityManager.instance(); im.createUser("admin", "admin"); im.createUser("guest", "guest"); System.out.println("Accounts created!"); } catch (Throwable t) { t.printStackTrace(); } finally { Lifecycle.endCall(); } } finally { Identity.setSecurityEnabled(true); System.out.println("Security restored..."); } System.out.println("=== APPLICATION STARTUP ===="); System.out.flush(); } @Destroy @Remove public void destroy() { } }
The accounts are created just fine, but the application throws an exception and JBoss (5.1.0-jdk6) stops it. So I am left with the accounts and a no longer running application. The exception is shown below, but the interesting thing I found is that I can prevent it (and have everything work perfectly) if I leave the LifeCycle.beginCall() open! In other words, If I remove the LifeCycle.endCall() from the snippet above, everything works.
So this post is more in relation to understanding what is going on: if I don't do a beginCall(), Seam fails with No application context active
. If I do, it fails with the exception below. The only way to keep it happy is to change the state in my @Create method and leave it changed. It does not seem right, but it works. Thing is, I need to understand why it works, otherwise I cannot feel safe about my code..
Anyway, here is what Seam complains about when I play nice and leave things as I found them:
10:49:15,750 INFO [ServletContextListener] Welcome to Seam 2.1.2 10:49:20,437 WARN [Component] Stateful session beans was bound to the APPLICATION context - note that it is not safe to make concurrent calls to the bean: applicationConfiguration 10:49:20,656 WARN [PersistentPermissionResolver] no permission store available - please install a PermissionStore with the name 'org.jboss.seam.security.jpaPermissionStore' if persistent permissions are required. 10:49:20,781 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container 10:49:20,796 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container 10:49:20,796 INFO [STDOUT] ============= APPLICATION STARTUP =============== 10:49:20,796 INFO [STDOUT] Disable security... 10:49:20,796 INFO [STDOUT] Create context... 10:49:20,812 INFO [STDOUT] Creating default user accounts... 10:49:21,078 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container 10:49:21,078 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container 10:49:21,515 INFO [STDOUT] Hibernate: select account0_.username as username21_, account0_.password as password21_ from accounts account0_ where account0_.username=? limit ? 10:49:21,625 INFO [STDOUT] Hibernate: insert into accounts (password, username) values (?, ?) 10:49:21,640 INFO [STDOUT] Hibernate: select account0_.username as username21_, account0_.password as password21_ from accounts account0_ where account0_.username=? limit ? 10:49:21,640 INFO [STDOUT] Accounts created! 10:49:21,656 INFO [STDOUT] Security restored... 10:49:21,656 INFO [STDOUT] ============= APPLICATION STARTUP =============== 10:49:21,656 INFO [STDOUT] Hibernate: insert into accounts (password, username) values (?, ?) 10:49:21,734 ERROR [webui]] Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener java.lang.NullPointerException at org.jboss.seam.contexts.Contexts.destroy(Contexts.java:241) at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:118) at org.jboss.seam.init.Initialization.init(Initialization.java:740) at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4393) at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310) at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142) at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461) at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118) at org.jboss.web.deployers.WebModule.start(WebModule.java:97) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157) at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96) at org.jboss.mx.server.Invocation.invoke(Invocation.java:88) at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264) at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668) at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206) at $Proxy38.start(Unknown Source) at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42) at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37) at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62) at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71) at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51) at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348) at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286) at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631) at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934) at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082) at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984) at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822) at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553) at org.jboss.system.ServiceController.doChange(ServiceController.java:688) at org.jboss.system.ServiceController.start(ServiceController.java:460) at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163) at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99) at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46) at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62) at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50) at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171) at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439) at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157) at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178) at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210) at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098) at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348) at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631) at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934) at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082) at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984) at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822) at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553) at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781) at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702) at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117) at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70) at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53) at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361) at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348) at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631) at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934) at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082) at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984) at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822) at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553) at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306) at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271) at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461) at org.jboss.Main.boot(Main.java:221) at org.jboss.Main$1.run(Main.java:556) at java.lang.Thread.run(Thread.java:619) 10:49:21,734 ERROR [StandardContext] Error listenerStart 10:49:21,734 ERROR [StandardContext] Context [/prj.webui] startup failed due to previous errors