我正在使用Struts + Hibernate + Spring进行项目开发。 这是我的Spring Context XML文件。当我在userDao.getXXXX方法的开头调用“sessionFactory.getCurrentSession()”时,抛出了一个异常,其详细消息是“没有Hibernate Session绑定到线程,并且配置不允许在这里创建非事务性的”。< / p>
<!-- Hibernate Configuration -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- Spring Transaction Manager -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- Spring Transaction Descriptions -->
<bean id="transactionAttributeSource"
class="org.springframework.transaction.interceptor.MethodMapTransactionAttributeSource">
<property name="methodMap">
<map>
<entry key="com.miaozhen.monitor.service.LoginServiceImpl.*">
<value>PROPAGATION_REQUIRED</value>
</entry>
</map>
</property>
</bean>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource"/>
</property>
</bean>
<bean id="transactionAdvisor"
class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<constructor-arg>
<ref bean="transactionInterceptor"/>
</constructor-arg>
</bean>
<bean id="autoproxy"
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
</bean>
<!-- DAO -->
<bean id="userDao"
class="com.miaozhen.dbservice.hibernate.dao.AUserDAO">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<!-- Service Layer -->
<bean id="loginService"
class="com.miaozhen.monitor.service.LoginServiceImpl">
<property name="userDao">
<ref bean="userDao"/>
</property>
</bean>
<!-- Struts Actions for DelegatingActionProxy -->
<bean name="/login"
class="com.miaozhen.monitor.struts.action.LoginAction">
<property name="loginService">
<ref bean="loginService"/>
</property>
</bean>
答案 0 :(得分:0)
这是一个相当复杂的配置,但是我怀疑loginService
bean在某种程度上没有被transactionAdvisor
代理,尽管我可以看到你正在尝试做的事情。
尝试确保注入控制器的loginService
实际上是生成的代理对象而不是原始LoginServiceImpl
对象。调试器在确保代码执行通过TransactionInterceptor
。
你有这样做的原因吗?有更简单的方法来实现相同的功能,不涉及创建顾问程序,autoproxy工厂,事务属性源等。例如,使用<tx:annotation-driven>
和@Transactional
可以轻松完成这些操作。也许是因为你当前的方法意味着你的代码中没有对Spring的引用是什么吸引你?