2009-10-22 6 views
0

J'utilise Struts + Hibernate + Spring pour le développement de mon projet. Et voici mon fichier XML Spring Context. Lorsque j'ai appelé "sessionFactory.getCurrentSession()" au début de la méthode userDao.getXXXX, l'exception dont le message de détail est "Aucune session Hibernate liée au thread, et la configuration n'autorise la création d'une session non-transactionnelle ici" a été lancée.Aucune session Hibernate liée au thread

<!-- 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> 

Répondre

0

C'est une configuration assez compliquée, mais je soupçonne que le haricot loginService est en quelque sorte pas avec le transactionAdvisor proxy, même si je vois que est ce que vous essayez de faire. Assurez-vous que le loginService qui est injecté dans le contrôleur est en fait un objet proxy généré plutôt que l'objet LoginServiceImpl brut. Un débogueur serait également très utile pour s'assurer que l'exécution du code passe par le TransactionInterceptor.

Y a-t-il une raison pour laquelle vous faites les choses de cette façon? Il existe des moyens beaucoup plus faciles d'obtenir la même chose, qui n'impliquent pas la création de conseillers, d'usines autoproxy, de sources d'attributs de transaction, etc. Par exemple, en utilisant <tx:annotation-driven> et @Transactional, simplifiez ce processus. Peut-être que c'est parce que votre approche actuelle signifie que vous ne devriez pas avoir de références à Spring dans votre code, c'est ce qui vous a plu?

+0

Merci pour votre excellente réponse.Je suis sûr que le service de connexion est un objet de classe de proxy. – lululau

Questions connexes