2016-08-20 133 views
0

我有一個bean,定義爲scope="session",並通過<aop:scoped-proxy/>創建,但是,當我訪問這樣的作用域CGLIB代理時,它甚至在會話之外工作,這是錯誤的。我已經嘗試了自動裝配代理或直接從應用程序上下文獲取它,但是,每次甚至在完全不是任何請求會話的一部分的新線程中,我都會從代理獲取實際值,而不是代理null或代理投擲例外。會話作用域bean工作在會話線程之外

這裏是例子bean定義

<bean id="commons" class="foo.bar.Commons" scope="session"> 
    <aop:scoped-proxy/> 
    <property name="securityEnabled" value="true"/> 
    <property name="modificationAllowed" value="true"/> 
    <property name="autoSave" value="true"/> 
</bean> 

這裏是我如何使用它:

public class CommonsModificatorProvider implements ModificatorProvider, ApplicationContextAware { 

    private ApplicationContext applicationContext; 

    @Override 
    public String getCurrentModificator() { 
     try { 
      Commons commons = applicationContext.getBean(Commons.class); 
      if (commons == null) 
       return "system"; 
      String user = commons.getCurrentUser(); 
      if (user == null) 
       return "system"; 
      return user; 
     } catch (Exception e) { 
      return "system"; 
     } 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     this.applicationContext = applicationContext; 
    } 
} 

然而,即使是在完全新的線程,getCurrentUser()總是返回一定的價值。

我試過讓CommonsModificationProviderprototype作用域,而不是自動裝配它,我每次從應用程序上下文中實例化它,但沒有區別。它將得到與自動裝配的「單獨」作用域版本相同的CGLIB代理。

回答

0

好的,顯然春天是試圖幫助和保存會話,如果你開始線程內會話(誰雖然是遠遠超過我)。

要解決此問題,您必須在新線程中調用RequestContextHolder.resetRequestAttributes();