2013-03-15 2 views
0

Привет, я написал модуль прослушивания аутентификации, чтобы заблокировать пользователя после максимальных попыток входа в систему.@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) Митос определяется как

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; 
} 

дао Пользователь определяется как:

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> 

Это ошибка, что я прибуду, когда я ввожу неправильный верительных в форме входа

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) 

Может кто-нибудь предложить, пожалуйста, где я идет не так.

+0

попробуйте установить распространение как http://stackoverflow.com/questions/9053095/why-this-no-session-found-for-current-thread-exceptions-in-spring-3-1-and -hibern – PSR

ответ

1

Обычно прокси-сервер весны не работает, когда метод вызывается внутри класса, но только из другого класса. Вы можете использовать aspectj, чтобы обойти эту проблему или перепроектировать свои классы.

Understnd aop proxies

0

Вы уверены, что вы определили UserDataSource в контексте приложения? Я его не вижу.

0

public User encounterFailedlogin(String userId) Аннотируется @Transactional. Насколько я вижу, это метод, который вызывается извне класса.

return encounterFailedlogin(user); - внутренний вызов и, как таковой, не проксирован. Таким образом, в этом случае public User encounterFailedlogin(User user) не имеет понятия о транзакционном.

Смежные вопросы