Сопровождаемый сессионный компонент в поток (Spring) - PullRequest
1 голос
/ 08 февраля 2012

У меня есть Spring-объект bean-объекта, установленный в веб-контексте. У меня есть задача, которая запускается как Callable, и мне нужен доступ к этому бину из этого потока. Как мне это сделать? Если я просто пытаюсь выполнить автоматическую раздачу компонента, я получаю сообщение об ошибке:

Область 'сессия' не активна для текущего потока

Сессионный компонент, который я внедряю, выглядит следующим образом:

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

Наконец, Callable запускается так:

@Autowired
private GenerateExportThread generateExportThread;

@Autowired
private AsyncTaskExecutor taskExecutor;

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

Реализация ISubmissionDao корректно внедряется, но не в UserInfoBean, потому что этот бин имеет сессионную область. Я в порядке, если нужно выполнить некоторую ручную работу с кодом, если необходимо скопировать объект из одного сеанса в другой во время запуска потока (если это имеет смысл), но я просто не знаю, как это сделать. Любые советы приветствуются. Спасибо!

1 Ответ

4 голосов
/ 08 февраля 2012

Делать ручную инъекцию:

Ваш боб в области потока:

@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
...