2012-02-07 92 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

相关问题