The situation is as follows:
Weblogic 8.1.4, MySql 5
EJB->Service Bean -> Dao
The ejb has a method declared as follows:
ComponentLocator gets the service from the spring context for tx proxying:Code:/** * @ejb.interface-method view-type="remote" * @ejb.transaction type="Required" */ public Subscriber createSubscriber(Subscriber s) throws SubscriberServiceException { return ComponentLocator.getSubscriberService().createSubscriber(s); }
the context is as follows:Code:public static SubscriberService getSubscriberService() { return (SubscriberService) context.getBean("subscriberService"); }
The target code is:Code:<bean id="subscriberServiceTarget" class="mypackage.SubscriberServiceImpl"/> <bean id="subscriberService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <property name="target"> <ref bean="subscriberServiceTarget"/> </property> <property name="transactionAttributes"> <props> <prop key="create*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="retrieve*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>
Which calls some jdbc template type code:Code:public Subscriber createSubscriber(Subscriber s) throws SubscriberServiceException { try { return SubscriberDAO.createSubscriber(s); } catch (DataAccessException e) { logger.error(e); throw new SubscriberServiceException("error creating subscriber", e); } }
With the following datasource:Code:public static Subscriber createSubscriber(Subscriber s) throws DataAccessException { JdbcTemplate jt = new JdbcTemplate(ComponentLocator .getMyDataSource()); GeneratedKeyHolder genkey = new GeneratedKeyHolder(); final String name = s.getName(); final String type = s.getType(); jt.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement ps = con .prepareStatement("insert into subscribers(subscriber_name, subscriber_type)" + " values (?,?)"); ps.setString(1, name); ps.setString(2, type); return ps; } }, genkey); .... // null pointer exception occurs later }
In the dao I encountered a null pointer exception, but the insert didn't roll back as expected.Code:<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>datasource.myDS</value> </property> <property name="jndiTemplate"> <ref bean="jndiTemplate"/> </property> </bean>
Here is the logging:
Any ideas as to why it's not really rolling back? Also, if I change the transaction manager as follows:Code:2005-08-09 16:17:53,780 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.support.TransactionSynchronizationManager.getResource(TransactionSynchronizationManager.java:136) - Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@10fb004] for key [weblogic.jdbc.common.internal.RmiDataSource@f6ede1] bound to thread [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] 2005-08-09 16:17:53,790 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.interceptor.RuleBasedTransactionAttribute.rollbackOn(RuleBasedTransactionAttribute.java:119) - Applying rules to determine whether transaction should rollback on java.lang.NullPointerException 2005-08-09 16:17:53,790 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.interceptor.RuleBasedTransactionAttribute.rollbackOn(RuleBasedTransactionAttribute.java:137) - Winning rollback rule is: null 2005-08-09 16:17:53,790 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.interceptor.RuleBasedTransactionAttribute.rollbackOn(RuleBasedTransactionAttribute.java:143) - No relevant rollback rule found: applying superclass default 2005-08-09 16:17:53,790 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.interceptor.TransactionAspectSupport.doCloseTransactionAfterThrowing(TransactionAspectSupport.java:272) - Invoking rollback for transaction on gov.epa.cdx.enviroflash.service.subscriber.SubscriberService.createSubscriber due to throwable [java.lang.NullPointerException] 2005-08-09 16:17:53,790 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion(AbstractPlatformTransactionManager.java:576) - Triggering beforeCompletion synchronization 2005-08-09 16:17:53,790 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:184) - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@10fb004] for key [weblogic.jdbc.common.internal.RmiDataSource@f6ede1] from thread [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] 2005-08-09 16:17:53,790 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:271) - Closing JDBC Connection 2005-08-09 16:17:53,830 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:502) - Setting existing transaction rollback-only 2005-08-09 16:17:53,830 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.jta.JtaTransactionManager.doSetRollbackOnly(JtaTransactionManager.java:739) - Setting JTA transaction rollback-only 2005-08-09 16:17:53,830 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCompletion(AbstractPlatformTransactionManager.java:606) - Triggering afterCompletion synchronization 2005-08-09 16:17:53,830 [ExecuteThread: '13' for queue: 'weblogic.kernel.Default'] DEBUG org.springframework.transaction.support.TransactionSynchronizationManager.clearSynchronization(TransactionSynchronizationManager.java:259) - Clearing transaction synchronization
It rolls back. But this isn't a good solution long term because this doesn't really mesh with Jta tx's.Code:<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="myDataSource"/> </bean>


Reply With Quote