2012-04-16 58 views
1

我有一個標記爲實體的User類,它也實現了UserDetails。我希望能夠獲取某個用戶的某些屬性,並根據它們的值返回getAuthorities方法中的特定角色。然而,這些屬性中的很多都是延遲加載的,並且需要Hibernate事務。在使用UserDetailsS​​ervice時對數據庫進行事務性調用

我嘗試了使用戶類@Transactional到製作UserDetailsServiceRememberMeService,我使用@Transactional。這些工作都沒有!

我所有的其他DAO和服務類的映射爲事務性工作(和他們只是簡單的類 - 除了一個@Transactional之上沒有其他註釋)

UPDATE:這是階級用戶被覆蓋的getUserDetails

@Override 
    public Collection<? extends GrantedAuthority> getAuthorities() { 

     GrantedAuthority auth = new GrantedAuthority() { 

      @Override 
      public String getAuthority() { 
       // TODO Auto-generated method stub 
       return "ROLE_USER"; 
      } 
     }; 

     ArrayList<GrantedAuthority> result = new ArrayList<GrantedAuthority>(); 

     if (options.size() > 0) { 
      for (Option o : options) { 
       result.add(createAuthority(Option.getStringType(o.type))); 
      } 
     } 

     result.add(auth); 

     return result; 

    } 
+0

不清楚問題是什麼?然後延遲加載您的authorites,或更改爲渴望提取... – NimChimpsky 2012-04-16 13:07:58

+0

@Transactional不起作用。至少在這種情況下, – preslavrachev 2012-04-16 13:09:28

+0

錯誤信息是什麼?顯示一些代碼。你是否堅持每個用戶授予權限 - 只是把它當作任何其他屬性來對待。 – NimChimpsky 2012-04-16 13:10:06

回答

0

UserDetails不是Spring bean,因此Spring不會去查找@Transactional就可以了。

我需要看到一個堆棧跟蹤,但我所假設的是getAuthorities()被另一個UserDetailsService方法直接調用,即不通過事務代理。

PlatformTransactionManager注入到UserDetailsService中,並使用TransactionTemplate中的TransactionTemplate在事務中包裝您的DB訪問代碼。

相關問題