PDA

View Full Version : Using Spring AOP based transaction with Struts1.x



mullangi13
Aug 7th, 2012, 10:19 AM
Hi Friends,

I am developing one application using Struts1.3+Spring2.5+Hibernate3.6 to do practice.
In this application I am using Spring AOP transactions, but transaction is not working for me.

Please check my code snippets and help me.

web.xml
=======
in addition to general entries, I have added the following code as well


<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListe ner</listener-class>
</listener>

applicationContext.xml
==================


<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransa ctionManager">
<property name="sessionFactory" ref="mySessionFactory" />
</bean>

<bean id="matchAllWithSave"
class="org.springframework.transaction.interceptor.NameMa tchTransactionAttributeSource" lazy-init='true'>
<property name="properties">
<props>
<prop key="save*">
PROPAGATION_REQUIRED,-Exception</prop>
<prop key="start*">
PROPAGATION_REQUIRED,-Exception</prop>
<prop key="newTx*">
PROPAGATION_REQUIRES_NEW,-Exception</prop>
<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
</props>
</property>
</bean>
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterc eptor">
<property name="sessionFactory" ref="mySessionFactory" />
</bean>
<bean id="matchSaveTxInterceptor"
class="org.springframework.transaction.interceptor.Transa ctionInterceptor" lazy-init="true">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributeSource"><ref bean="matchAllWithSave"/></property>

</bean>
<bean id="autoProxyCreator"
class="com.mokjas.extra.InterfaceAutoProxyCreator" lazy-init="true">
<property name="interceptorNames">
<list>
<idref local="matchSaveTxInterceptor"/>
<idref local="hibernateInterceptor"/>

</list>
</property>
<property name="interfaces">
<list>
<value>com.mokjas.service.ITransactionalSaveService</value>
</list>
</property>
</bean>

Here all my service classes implemented this "ITransactionalSaveService" marker interface. So as per the above configuration,any service class which has save* method should wrap with transactions. But for me it is not working.

ServiceFinder.java
==============

public class ServiceFinder {
public static ApplicationContext getContext(HttpServletRequest httpRequest) {
return WebApplicationContextUtils.getRequiredWebApplicati onContext(
httpRequest.getSession().getServletContext());
}
}
Struts Action class:
==============
here in my action class I am calling save* method of my service class(implemented ITransactionalSaveService)


transferService.saveAccountTransfer(fromBean, toBean);

ServiceImpl class:
==============


public void saveAccountTransfer(UserBean fromBean,UserBean toBean){
// TODO Auto-generated method stub

getBankDAO().processTransfer(toBean,"To");
getBankDAO().processTransfer(fromBean,"From");

}

DAO Impl class:
===========

public void processTransfer(UserBean bean, String name) {
Session session=getSessionFactory().openSession();
session.saveOrUpdate(bean);
session.close();

}

After we execute this
session.saveOrUpdate(bean);
my hibernate is not saving the beans accordingly because there is no transaction applied. so hibernate is generating only select statement,not update statement.

Please help me to solve my issue.

Thanks,
Bunny

Marten Deinum
Aug 7th, 2012, 12:01 PM
Don't use openSession... use getCurrentSession and don't mess around with closing the session yourself, springs transactionmanagement does that for you.

Also you really should be using dependency injection and I consider your ServiceFinder an anti pattern you should inject the dependencies.

mullangi13
Aug 8th, 2012, 04:30 AM
Thanks A lot Marten Deinum. Really I am very happy with your support.


Also you really should be using dependency injection and I consider your ServiceFinder an anti pattern you should inject the dependencies.

I cann't understand your point. Could you please elaborate more by taking my application code.

Thanks,
Bunny