Spring &引用;找不到当前线程的会话“;添加@Autowire时

Spring &引用;找不到当前线程的会话“;添加@Autowire时,spring,hibernate,Spring,Hibernate,我见过几个类似的问题,但没有一个建议的解决方案对我有帮助 概要:当我在.xml上创建和注入bean时,它是有效的;但当我使用@Autowire或@Resource时,它不会 环境:Spring3、Hibernate4、Tomcat7 详细信息:以下设置不起作用: web.xml: <context-param> <param-name>contextConfigLocation</param-name> <param-value>

我见过几个类似的问题,但没有一个建议的解决方案对我有帮助

概要:当我在.xml上创建和注入bean时,它是有效的;但当我使用@Autowire或@Resource时,它不会

环境:Spring3、Hibernate4、Tomcat7

详细信息:以下设置不起作用:

web.xml

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      /WEB-INF/spring/root-context.xml
      /WEB-INF/spring/security-context.xml
      /WEB-INF/spring/users-context.xml
    </param-value>
  </context-param>
  <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/venus" />
    <property name="username" value="root" />
    <property name="password" value="" />
  </bean>

  <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.airbus.genesis.marte.dal" />
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
      </props>
    </property>
  </bean>

  <tx:annotation-driven transaction-manager="txManager" />
  <bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
  <bean id="usersDAO" class="com.airbus.genesis.marte.dal.users.UsersDAO">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
<!-- 
  <bean id="usersDAO" class="com.airbus.genesis.marte.dal.users.UsersDAO">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
-->
users context.xml

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      /WEB-INF/spring/root-context.xml
      /WEB-INF/spring/security-context.xml
      /WEB-INF/spring/users-context.xml
    </param-value>
  </context-param>
  <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/venus" />
    <property name="username" value="root" />
    <property name="password" value="" />
  </bean>

  <bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.airbus.genesis.marte.dal" />
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">true</prop>
      </props>
    </property>
  </bean>

  <tx:annotation-driven transaction-manager="txManager" />
  <bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
  <bean id="usersDAO" class="com.airbus.genesis.marte.dal.users.UsersDAO">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
<!-- 
  <bean id="usersDAO" class="com.airbus.genesis.marte.dal.users.UsersDAO">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
-->
DAO对象(请注意,@Repository和@Resource现在没有注释):

如果我使用@Autowire而不是@Resource,也会发生同样的情况


我想这是我的误解,但我找不到原因。有什么想法吗?

问题可能是在dispatcher-servlet.xml配置中拾取了
@Repository
@Service
注释(是否使用
上下文:组件扫描
?),因此这些bean是在dispatcher-servlet上下文而不是根web应用上下文中创建的

一个好的做法是将服务层对象放在专用包中,并使用特定包名作为
基本包
限定符(如'com.myproject.services')。还可以使用过滤器表达式包含和排除元素。请参见此处的示例:
和第4.10.3节


另请参见

这是解决方案。我这边有个例外。