[jboss-jira] [JBoss JIRA] Commented: (EJBTHREE-665) @PostConstruct throws NPE when EntityManager is used
Erik Hansen (JIRA)
jira-events at lists.jboss.org
Tue Nov 6 18:33:45 EST 2007
[ http://jira.jboss.com/jira/browse/EJBTHREE-665?page=comments#action_12386288 ]
Erik Hansen commented on EJBTHREE-665:
--------------------------------------
I had this same problem trying to use an injected PersistenceContext in a @PostConstruct and found that, apparently, the EntityManager should not be used in @PostConstruct callbacks.
If I read the spec right, section 3.5 of the EJB3 persistence spec says that the EntityManager should not be used in LifecycleCallbacks:
3.5 Entity Listeners and Callback Methods
The following rules apply to lifecycle callbacks:
• Lifecycle callback methods may throw unchecked/runtimeexceptions. A runtime exception thrown by a callback method that executes within a transaction causes that transaction to be rolled back.
• Lifecycle callbacks can invoke JNDI, JDBC, JMS, and enterprise beans.
• In general, portable applications should not invoke EntityManager or Query operations, access other entity instances, or modify relationships in a lifecycle callback method.[19]
When invoked from within a Java EE environment, the callback listeners for an entity share the enterprise naming context of the invokingcomponent, and the entity callback methods are invoked in the transaction and security contexts of the calling component at the time at which the callback method is invoked.[20]
[19] The semantics of such operations may be standardized in a future release of this specification.
> @PostConstruct throws NPE when EntityManager is used
> ----------------------------------------------------
>
> Key: EJBTHREE-665
> URL: http://jira.jboss.com/jira/browse/EJBTHREE-665
> Project: EJB 3.0
> Issue Type: Bug
> Components: EJB3 Extensions
> Affects Versions: EJB 3.0 RC8 - FD
> Environment: Windows XP, JBoss 4.0.4.GA + EJB-3.0-RC8
> Reporter: Steven Verze
> Assigned To: Carlo de Wolf
> Fix For: AS 4.2.3.GA
>
> Attachments: EJB-665.patch, EJB-665.patch, EJB-665.patch
>
>
> @PostConstruct method throws NPE when called on a stateless session bean.
> The method iteself accesses the enetity manager and tries create a query, the following exception is experienced:
> java.lang.RuntimeException: java.lang.NullPointerException
> at org.jboss.ejb3.interceptor.LifecycleInterceptorHandler.postConstruct(LifecycleInterceptorHandler.java:109)
> at org.jboss.ejb3.EJBContainer.invokePostConstruct(EJBContainer.java:582)
> at org.jboss.ejb3.AbstractPool.create(AbstractPool.java:108)
> at org.jboss.ejb3.ThreadlocalPool.get(ThreadlocalPool.java:48)
> at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:54)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:227)
> at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
> at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
> at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828)
> at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681)
> at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358)
> at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:398)
> at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)
> Caused by: java.lang.NullPointerException
> at org.jboss.ejb3.entity.ManagedEntityManagerFactory.getNonTxEntityManager(ManagedEntityManagerFactory.java:58)
> at org.jboss.ejb3.entity.ManagedEntityManagerFactory.getTransactionScopedEntityManager(ManagedEntityManagerFactory.java:163)
> at org.jboss.ejb3.entity.TransactionScopedEntityManager.createQuery(TransactionScopedEntityManager.java:125)
> at com.teleglobal.modules.snapaccount.services.SnapAccountSendProcessServiceBean.initialiseSpendCardQuery(SnapAccountSendProcessServiceBean.java:83)
> 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:585)
> at org.jboss.ejb3.interceptor.LifecycleInvocationContextImpl.proceed(LifecycleInvocationContextImpl.java:159)
> at org.jboss.ejb3.interceptor.LifecycleInterceptorHandler.postConstruct(LifecycleInterceptorHandler.java:105)
> at org.jboss.ejb3.EJBContainer.invokePostConstruct(EJBContainer.java:582)
> at org.jboss.ejb3.AbstractPool.create(AbstractPool.java:108)
> at org.jboss.ejb3.ThreadlocalPool.get(ThreadlocalPool.java:48)
> at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:54)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:227)
> at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
> at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
> at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828)
> at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681)
> at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358)
> at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:398)
> at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)
> at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:190)
> at org.jboss.remoting.Client.invoke(Client.java:525)
> at org.jboss.remoting.Client.invoke(Client.java:488)
> at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:55)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:55)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:78)
> at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
> at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:102)
> at $Proxy3.getBatchNumbers(Unknown Source)
> at com.teleglobal.modules.snapaccount.services.SnapAccountSendProcessServiceTest.testGetBatchNumbers(SnapAccountSendProcessServiceTest.java:57)
> 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:585)
> at junit.framework.TestCase.runTest(TestCase.java:154)
> at junit.framework.TestCase.runBare(TestCase.java:127)
> at junit.framework.TestResult$1.protect(TestResult.java:106)
> at junit.framework.TestResult.runProtected(TestResult.java:124)
> at junit.framework.TestResult.run(TestResult.java:109)
> at junit.framework.TestCase.run(TestCase.java:118)
> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> Here is a the post construct method:
> @PostConstruct
> void initialiseSpendCardQuery()
> {
> StringBuilder sendCardQueryString = new StringBuilder();
> sendCardQueryString.append("SELECT c FROM Card AS c WHERE c.status = 'U' AND c.batchNumber IN (");
>
> long[] batchNumbers = getBatchNumbers();
> for (int i = 0; i < batchNumbers.length; i++)
> {
> sendCardQueryString.append("?").append(i);
> if (i+1 < batchNumbers.length)
> sendCardQueryString.append(",");
> }
> sendCardQueryString.append(") AND c NOT IN (SELECT lc.sendCard FROM SendCardLock AS lc)");
> sendCardQuery = entityManager.createQuery(sendCardQueryString.toString());
>
> for (int i = 0; i < batchNumbers.length; i++)
> sendCardQuery.setParameter(i, batchNumbers[i]);
> }
> It happens when the entityManager is used.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list