org.hibernate.HibernateException:当前没有绑定到执行上下文的会话

org.hibernate.HibernateException:当前没有绑定到执行上下文的会话,hibernate,session,spring-security,dao,sessionfactory,Hibernate,Session,Spring Security,Dao,Sessionfactory,我正在尝试将Spring安全性与Hibernate集成。我对这两种技术都是新手,所以几乎可以肯定,我在这里一次执行了太多步骤,但我现在要从数据库中对用户进行身份验证。我认为这当然更像是一个Hibernate问题,而不是Spring安全问题,但我提到它是为了提供一些上下文。下面是错误消息和代码。有人能发现什么吗 org.hibernate.HibernateException: No session currently bound to execution context org.hibe

我正在尝试将Spring安全性与Hibernate集成。我对这两种技术都是新手,所以几乎可以肯定,我在这里一次执行了太多步骤,但我现在要从数据库中对用户进行身份验证。我认为这当然更像是一个Hibernate问题,而不是Spring安全问题,但我提到它是为了提供一些上下文。下面是错误消息和代码。有人能发现什么吗

org.hibernate.HibernateException: No session currently bound to execution context
    org.hibernate.context.ManagedSessionContext.currentSession(ManagedSessionContext.java:74)
    org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:622)
    com.vicinity.dao.hibernate.GenericHibernateDAO.findByCriteria(GenericHibernateDAO.java:99)
    com.vicinity.dao.hibernate.HibernateUserDAO.getUserByLogin(HibernateUserDAO.java:35)
    com.vicinity.service.PersistentUserManager.loadUserByUsername(PersistentUserManager.java:67)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    $Proxy31.loadUserByUsername(Unknown Source)
    org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:83)
    org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:125)
    org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:121)
    org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:49)
    org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:139)
    org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:49)
    org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:98)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:106)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:108)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:150)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
DAO和事务管理的配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
</bean>

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

<bean id="hibernateUserDAO" class="com.vicinity.dao.hibernate.HibernateUserDAO">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="userManagerTarget" class="com.vicinity.service.PersistentUserManager">
    <property name="userDAO" ref="hibernateUserDAO" />
</bean> 

<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref local="transactionManager" />
    </property>
    <property name="target">
        <ref local="userManagerTarget" />
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="loadUserByUsername">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>
下面是从数据库读取的DAO。请注意,我试图利用“GenericDAO模式”:

@Repository("userDAO")
public class HibernateUserDAO extends GenericHibernateDAO<User, Long> implements UserDAO {

    public HibernateUserDAO() {
        super(User.class);
    }

    @Override
    public void createUser(User user) {
        super.makePersistent(user);
    }

    public User getUserByLogin(String login) {
        if (null == login) {
            throw new IllegalArgumentException("You must provide a username if you want to get the user.");
        }

        List<User> users = findByCriteria(Restrictions.eq("login", login));

        // TODO, might need to check here if there are more than one user with the same username
        if(users == null || users.size() == 0) {
            return null;
        } else {
            return users.get(0);
        }
    }
}
我的hibernate配置(hibernate.cfg.xml)中有以下内容,它们可能是相关的:

<property name="current_session_context_class">org.hibernate.context.ManagedSessionContext</property>
org.hibernate.context.ManagedSessionContext

您是否配置了事务管理

org.springframework.orm.hibernate3.HibernateTransactionManager


请尝试使用此属性名称

<property name="hibernate.current_session_context_class">
       org.hibernate.context.ManagedSessionContext</property>

org.hibernate.context.ManagedSessionContext

不过,最好将spring配置为负责会话和事务管理。您可以检查。

我想问题是由于

springUser = new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPassword(), true, true, true, true, new ArrayList<GrantedAuthority>());
springUser=new org.springframework.security.core.userdetails.User(User.getLogin(),User.getPassword(),true,true,true,new ArrayList());
Spring在DAO中使用模板模式,因此当您执行
getUserByLogin
时,Spring将创建一个会话,当您使用此方法时,会话将关闭。因此,当您再次执行
user.getLogin()
时,没有附加会话,您将得到错误

尝试使用
OpenSessionInViewFilter
。。。。您可能需要在google中搜索它(因为我自己也没有使用过它,因此无法在此处显示代码)


另外,您还可以做一件事,如果您从DAO本身返回
springUser
(即在
getUserByLogin
本身中,那么它将使用相同的会话对象,并且它应该可以工作)

我最近遇到了完全相同的错误,并试图找出问题所在

在我的例子中,我使用了
web.xml
文件中配置的
OpenSessionInViewFilter
,以及那里的Spring安全配置

由于Spring Security和OpenSessionInViewFilter都是过滤器,因此应用它们的顺序取决于它们在
web.xml
文件中出现的顺序


在我的例子中,我最初在Spring安全过滤器下面有
OpenSessionInViewFilter
。一旦我交换了他们的位置(即将
OpenSessionInViewFilter
放在Spring Security的上面),一切都很好

没有。但我现在已经编辑了我的原创文章。同样的错误,但我至少可以看到AOP正在运行。你能看一下吗?谢谢你的回答,但我认为这个答案太离题了。首先,您引用的代码行甚至不会执行。其次,我没有使用Spring的模板模式(我最近读到这在很大程度上是多余的,尤其是在使用Hibernate3时)。第三,我的应用程序对用户的表示不同于Spring Security,据我所知,目前有必要为Spring Security framework提供“org.springframework.Security.core.userdetails.User1”。是的,我之前没有看到您没有使用Spring模板模式。好的,我尝试过配置事务管理,并且按照您的建议更改了属性的名称,但是还没有成功。
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
<property name="hibernate.current_session_context_class">
       org.hibernate.context.ManagedSessionContext</property>
springUser = new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPassword(), true, true, true, true, new ArrayList<GrantedAuthority>());