Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@事务性未创建会话-org.hibernate.HibernateException:未找到当前线程的会话_Hibernate_Spring Mvc_Spring Security - Fatal编程技术网

@事务性未创建会话-org.hibernate.HibernateException:未找到当前线程的会话

@事务性未创建会话-org.hibernate.HibernateException:未找到当前线程的会话,hibernate,spring-mvc,spring-security,Hibernate,Spring Mvc,Spring Security,您好,我已经编写了一个身份验证事件侦听器模块,用于在最大登录尝试次数后锁定用户 <beans:bean id="ftfStatsAuthenticationEvent" class="com.ibm.ftfstats.auth.FTFStatsAuthenticationEvent"> <beans:property name="userMgr" ref="userManager"></beans:property> </beans:bean>

您好,我已经编写了一个身份验证事件侦听器模块,用于在最大登录尝试次数后锁定用户

<beans:bean id="ftfStatsAuthenticationEvent" class="com.ibm.ftfstats.auth.FTFStatsAuthenticationEvent">
<beans:property name="userMgr" ref="userManager"></beans:property>
</beans:bean>
getUserMgr()
返回一个用户管理器类,其中
遇到FailedLogin(userId)
方法定义为

public User encounterFailedlogin(String userId) {
    // TODO Auto-generated method stub
    User user = getUserDAO().getUserById(userId);
    return encounterFailedlogin(user);

}

@Transactional
public User encounterFailedlogin(User user) {
    // TODO Auto-generated method stub
    int failedAttempts = user.getFailedAttempts() + 1;
    user.setFailedAttempts(failedAttempts);
    System.out.println("updating user");
    updateUser(user);
    return getUserDAO().getUserById(user.getUserID());
    //return true;
}
 @Transactional
public boolean updateUser(User user){
    getUserDAO().updateUser(user);
    return true;
}
<!-- UserDB Session Factory Declaration -->
<bean id="UserSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="UserDataSource" />
    <property name="annotatedClasses">
        <list>
            <value>com.ibm.ftfstats.data.user.model.User</value>                
            <value>com.ibm.ftfstats.data.user.model.Environment</value>
            <value>com.ibm.ftfstats.data.user.model.Role</value>
            <value>com.ibm.ftfstats.data.user.model.Question</value>
            <value>com.ibm.ftfstats.data.user.model.SearchCriteria</value>
            <value>com.ibm.ftfstats.data.user.model.UserRequest</value>
            <value>com.ibm.ftfstats.data.user.model.RequestType</value>
            <value>com.ibm.ftfstats.data.user.model.RequestComment</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>   

        </props>
    </property>
</bean>

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

<tx:annotation-driven/>

<!-- DAOs List goes here -->
<bean id="UserDAO" class="com.ibm.ftfstats.data.dao.UserDAO">
    <property name="sessionFactory" ref="UserSessionFactory"></property>
    <property name="msg" ref="msgBundle"></property>
</bean>
<bean id="userManager" class="com.ibm.ftfstats.service.impl.UserManagerImp">
    <property name="userDAO" ref="UserDAO" />       
</bean>
用户DAO定义为:

public void addUser(User user){
    getSessionFactory().getCurrentSession().save(user);
}
我的应用程序上下文文件定义为

public User encounterFailedlogin(String userId) {
    // TODO Auto-generated method stub
    User user = getUserDAO().getUserById(userId);
    return encounterFailedlogin(user);

}

@Transactional
public User encounterFailedlogin(User user) {
    // TODO Auto-generated method stub
    int failedAttempts = user.getFailedAttempts() + 1;
    user.setFailedAttempts(failedAttempts);
    System.out.println("updating user");
    updateUser(user);
    return getUserDAO().getUserById(user.getUserID());
    //return true;
}
 @Transactional
public boolean updateUser(User user){
    getUserDAO().updateUser(user);
    return true;
}
<!-- UserDB Session Factory Declaration -->
<bean id="UserSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="UserDataSource" />
    <property name="annotatedClasses">
        <list>
            <value>com.ibm.ftfstats.data.user.model.User</value>                
            <value>com.ibm.ftfstats.data.user.model.Environment</value>
            <value>com.ibm.ftfstats.data.user.model.Role</value>
            <value>com.ibm.ftfstats.data.user.model.Question</value>
            <value>com.ibm.ftfstats.data.user.model.SearchCriteria</value>
            <value>com.ibm.ftfstats.data.user.model.UserRequest</value>
            <value>com.ibm.ftfstats.data.user.model.RequestType</value>
            <value>com.ibm.ftfstats.data.user.model.RequestComment</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>   

        </props>
    </property>
</bean>

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

<tx:annotation-driven/>

<!-- DAOs List goes here -->
<bean id="UserDAO" class="com.ibm.ftfstats.data.dao.UserDAO">
    <property name="sessionFactory" ref="UserSessionFactory"></property>
    <property name="msg" ref="msgBundle"></property>
</bean>
<bean id="userManager" class="com.ibm.ftfstats.service.impl.UserManagerImp">
    <property name="userDAO" ref="UserDAO" />       
</bean>

com.ibm.ftfstats.data.user.model.user
com.ibm.ftfstats.data.user.model.Environment
com.ibm.ftfstats.data.user.model.Role
com.ibm.ftfstats.data.user.model.Question
com.ibm.ftfstats.data.user.model.SearchCriteria
com.ibm.ftfstats.data.user.model.UserRequest
com.ibm.ftfstats.data.user.model.RequestType
com.ibm.ftfstats.data.user.model.RequestComment
org.hibernate.dialogue.mysqldialogue
真的
这是我在登录表单中输入错误凭证时遇到的错误

SEVERE: Servlet.service() for servlet default threw exception
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:978)
at com.ibm.ftfstats.data.dao.UserDAO.updateUser(UserDAO.java:35)
at com.ibm.ftfstats.data.dao.UserDAO$$FastClassByCGLIB$$37731f27.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:627)
at com.ibm.ftfstats.data.dao.UserDAO$$EnhancerByCGLIB$$388b21db.updateUser(<generated>)
at com.ibm.ftfstats.service.impl.UserManagerImp.updateUser(UserManagerImp.java:97)
at com.ibm.ftfstats.service.impl.UserManagerImp.encounterFailedlogin(UserManagerImp.java:84)
at com.ibm.ftfstats.service.impl.UserManagerImp.encounterFailedlogin(UserManagerImp.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198)
at $Proxy17.encounterFailedlogin(Unknown Source)
at  com.ibm.ftfstats.auth.FTFStatsAuthenticationEvent.onAuthenticationFailureBadCredentialsEvent(FTFStatsAuthenticationEvent.java:42)
at com.ibm.ftfstats.auth.FTFStatsAuthenticationEvent.onApplicationEvent(FTFStatsAuthenticationEvent.java:29)
严重:Servlet默认值的Servlet.service()引发异常 org.hibernate.hibernateeexception:未找到当前线程的会话 位于org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 位于org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:978) 位于com.ibm.ftfstats.data.dao.UserDAO.updateUser(UserDAO.java:35) 在com.ibm.ftfstats.data.dao.UserDAO$$FastClassByCGLIB$$37731f27.invoke()上 位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:627) 在com.ibm.ftfstats.data.dao.UserDAO$$enhancerbyglib$$388b21db.updateUser()上 位于com.ibm.ftfstats.service.impl.UserManagerImp.updateUser(UserManagerImp.java:97) 位于com.ibm.ftfstats.service.impl.UserManagerImp.encounterFailedlogin(UserManagerImp.java:84) 位于com.ibm.ftfstats.service.impl.UserManagerImp.encounterFailedlogin(UserManagerImp.java:74) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:597) 位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198) 在$Proxy17处。遇到FailedLogin(未知来源) 位于com.ibm.ftfstats.auth.FTFStatsAuthenticationEvent.onAuthenticationFailureBadCredentialsEvent(FTFStatsAuthenticationEvent.java:42) 位于com.ibm.ftfstats.auth.FTFStatsAuthenticationEvent.onApplicationEvent(FTFStatsAuthenticationEvent.java:29)
谁能告诉我哪里出了问题。

通常,当一个方法在一个类中被调用,但仅从另一个类调用时,spring代理不起作用。您可以使用aspectj来解决这个问题或重新设计您的类


您确定在应用程序上下文中定义了UserDataSource吗?我没有看到。

公共用户遇到失败登录(字符串userId)
需要用
@Transactional
注释。据我所知,这是从类外部调用的方法


返回遇到失败登录(用户)
是一个内部调用,因此不被代理。因此,在这种情况下,
公共用户遇到失败登录(用户用户)
不知道是事务性的。

尝试将传播设置为