Hi,
I'm getting NullPointerException from HibernateTemplate when using TransactionProxyFactoryBean. If I access my bean directly, bypassing the proxy, everything works fine. Basically I'm doing the following from a servlet (simplified a lot):
1: // Start a JTA transaction (we need XA)
2: userTransaction.begin();
3: myDao.getHibernateTemplate().load(class1, id);
4: // Start a new transaction (PROPAGATION_REQUIRES_NEW)
5: myProxiedDao.getHibernateTemplate().save(foo);
6: userTransaction.commit(); // or rollback
Both Daos are using the same LocalSessionFactoryBean. It does not make any difference if I specify PROPAGATION_REQUIRED instead of PROPAGATION_REQUIRES_NEW.
If I change the order of lines 3 and 5, everything works!? Unfortunately the business logic does not allow changing the order.
I have spent a couple of days debugging Spring's internals and it seems that when line 5 is executed, a SessionHolder is found in the current thread and its isSynchronizedWithTransaction() is true but SessionHolder.sessionMap does not contain a default session. As a result, the following condition in SessionFactoryUtils.getSession evaluates to false and a null Session is returned, which later causes a NullPointerException in HibernateTemplate:
if (allowSynchronization && !sessionHolder.isSynchronizedWithTransaction()) {
...
}
return sessionHolder.getSession();
We are using Spring 1.1.3, Hibernate 2.1.7 and WebLogic 8.1 SP4. Unfortunately our schedule does not allow upgrading any of these since then full regression testing would be needed, for which we don't have time.
Am I trying something that is not supported? Or has been fixed in a later Spring release? What should I try next? Excerpts from my configuration below.
I'd really appreciate if someone could shed some light on this. Thanks!
Br,
Timo
And here's the exception stack trace that Andreas asked for:Code:<bean id="localSessionFactory" parent="abstractLocalSessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">net.sf.hibernate.dialect.Oracle9Dialect</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</prop> <prop key="hibernate.cache.region_prefix">epm</prop> <prop key="hibernate.query.substitutions">true 1, false 0</prop> <prop key="hibernate.transaction.factory_class"> net.sf.hibernate.transaction.JTATransactionFactory </prop> <prop key="hibernate.transaction.manager_lookup_class"> net.sf.hibernate.transaction.WeblogicTransactionManagerLookup </prop> </props> </property> <property name="dataSource"> <ref bean="localDataSource"/> </property> </bean> <bean id="importLoggingServiceTarget" class="com.mycompany.epm.service.ImportLoggingServiceImpl"> <property name="sessionFactory"> <ref bean="localSessionFactory"/> </property> </bean> <bean id="txManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/> <bean id="importLoggingService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="txManager"/> </property> <property name="target"> <ref bean="importLoggingServiceTarget"/> </property> <property name="proxyInterfaces"> <value>com.mycompany.epm.service.ImportLoggingService</value> </property> <property name="transactionAttributes"> <props> <!-- The following rule applies on line 5 above --> <prop key="isolated*">PROPAGATION_REQUIRES_NEW</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
The $Proxy8.save line is the line 5 of my simplified code shown above.Code:java.lang.NullPointerException at org.springframework.orm.hibernate.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:870) at org.springframework.orm.hibernate.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:385) at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:243) at org.springframework.orm.hibernate.HibernateTemplate.save(HibernateTemplate.java:383) at com.mycompany.epm.service.ImportLoggingServiceImpl.doSave(ImportLoggingServiceImpl.java:55) at com.mycompany.epm.service.ImportLoggingServiceImpl.save(ImportLoggingServiceImpl.java:34) 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:324) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:56) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174) at $Proxy8.save(Unknown Source) at com.mycompany.epm.application.importing.sap.receival.MessageReceiver.logMessageToDB(MessageReceiver.java:222) at com.mycompany.epm.application.importing.sap.receival.MessageReceiver.handleMessage(MessageReceiver.java:137) at com.mycompany.epm.application.actions.saprtitesting.PostSapRtiMessageAction.execute(PostSapRtiMessageAction.java:73) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:996) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) at com.mycompany.epm.infra.filter.OpenSessionsInViewFilter.doFilterInternal(OpenSessionsInViewFilter.java:53) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6458) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118) at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3661) at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2630) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)


Reply With Quote