您好我已經寫了一個身份驗證事件偵聽器模塊來鎖定最大登錄嘗試後的用戶。@Transactional沒有創建會話 - org.hibernate.HibernateException:沒有找到當前線程的會話
<beans:bean id="ftfStatsAuthenticationEvent" class="com.ibm.ftfstats.auth.FTFStatsAuthenticationEvent">
<beans:property name="userMgr" ref="userManager"></beans:property>
</beans:bean>
這是如何用於捕獲有authenticationFailure事件的模塊已被定義
public void onApplicationEvent(ApplicationEvent event) {
// TODO Auto-generated method stub
if(event instanceof AuthenticationFailureBadCredentialsEvent){
onAuthenticationFailureBadCredentialsEvent((AuthenticationFailureBadCredentialsEvent)event);
}else if(event instanceof AuthenticationSuccessEvent){
onAuthenticationSuccessEvent((AuthenticationSuccessEvent)event);
}
}
public void onAuthenticationFailureBadCredentialsEvent(AuthenticationFailureBadCredentialsEvent event){
Authentication authentication = event.getAuthentication();
String userId = authentication.getName();
System.out.println("bad credential for user : " + userId);
getUserMgr().encounterFailedlogin(userId);
User user = getUserMgr().getUserById(userId);
}
的getUserMgr()
返回其中encounterFailedlogin(userId)
methos被定義爲
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;
}
用戶DAO一個用戶管理器類被定義爲:
public void addUser(User user){
getSessionFactory().getCurrentSession().save(user);
}
我的應用程序上下文文件被定義爲
<!-- 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>
這是我一個GET當我登錄表單中輸入了錯誤的憑據錯誤
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)
任何人都可以請建議我在哪裏出錯了。
嘗試通過設置傳播等 http://stackoverflow.com/questions/9053095/why-this-no-session-found-for-current-thread-exceptions-in-spring-3-1-and -hibern – PSR 2013-03-16 11:22:48