2012-02-07 148 views
0

我有一個Spring會話範圍的bean,它在Web上下文中設置。我有一個作爲Callable運行的任務,並且我需要從該線程中訪問此Bean。我應該如何做到這一點?如果我只是嘗試自動裝配bean的我得到錯誤信息:將會話範圍的bean自動裝入線程(Spring)

範圍「會議」不是當前線程

會話作用域的bean我注射看起來像這樣活躍:

<bean id="userInfo" class="com.company.web.UserInfoBean" scope="session"> 
    <aop:scoped-proxy /> 
</bean> 

,我試圖給它注入到看起來像這樣的類:

@Component 
@Scope(value = "thread", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class GenerateExportThread implements Callable<String> { 
    ... 
    // this class contains an @Autowired UserInfoBean 
    @Autowired 
    private ISubmissionDao submissionDao; 
    ... 
} 
因爲bean是會話範圍

@Autowired 
private GenerateExportThread generateExportThread; 

@Autowired 
private AsyncTaskExecutor taskExecutor; 

public void myMethod() { 
... 
    Future<String> future = taskExecutor.submit(new ThreadScopeCallable<String>(generateExportThread)); 
... 
} 

的ISubmissionDao實施得到正確注射,而不是它的UserInfoBean:210

最後,可調用正在啓動這個樣子。如果需要在線程啓動時將對象從一個會話複製到另一個會話中(如果這有意義),但我只是不知道如何去做這件事,我可以做一些手動代碼工作。任何提示都表示讚賞。謝謝!

回答

4

做手工注:

你的線程範圍的bean:

@Component 
@Scope(value = "thread", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class GenerateExportThread implements Callable<String> { 
    ... 
    // this class contains an @Autowired UserInfoBean 
    private ISubmissionDao submissionDao; 

    public void setSubmissionDao(ISubmissionDao submissionDao) { 
     this.submissionDao = submissionDao; 
    } 
    ... 
} 

在您的請求線程:

... 
@Autowired // This should work as a request has an implicit session 
private ISubmissionDao submissionDao; 

@Autowired // This should also work: the request thread should have a thread-scoped exportThread 
private GenerateExportThread generateExportThread; 

... 
generateExportThread.setSubmissionDao(submissionDao); 
String result = generateExportThread.call(); // Or whatever you use to run this thread 
+0

我認爲這是工作,但不完全是。從線程內調用submissionDao時,UserDocument對象仍然無法在submissionDao中訪問。它給出錯誤消息:找不到線程綁定請求:您是否在實際Web請求之外引用請求屬性,或者在原始接收線程之外處理請求? – Markus 2012-02-07 22:06:21

+1

它看起來像手動設置線程外部的submissionDao中的UserInfoBean對象可以正常工作。我會接受這個答案,因爲它給了我解決問題所需的一切。謝謝。 – Markus 2012-02-07 22:09:23

相關問題