У меня проблема в том, что я хочу перенести некоторые процессы моего приложения Spring WebMVC в отдельные потоки.Это было достаточно просто и работает, пока я не хочу использовать класс userRightService, который использует глобальный запрос.Это не доступно в темах, и мы получаем проблему, это в значительной степени понятно.
Это моя ошибка:
java.lang.RuntimeException:
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'scopedTarget.userRightsService': Scope 'request' is not active
for the current thread; consider defining a scoped proxy for this bean if
you intend to refer to it from a singleton; nested exception is
java.lang.IllegalStateException: Cannot ask for request attribute -
request is not active anymore!
Хорошо, достаточно ясно.Я пытаюсь сохранить контекст запроса, реализуя это решение:
Как включить область запроса в асинхронном исполнителе задач
Это мой исполняемый класс:
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class myThread implements Runnable {
private RequestAttributes context;
public DataExportThread(RequestAttributes context) {
this.context = context;
}
public void run() {
RequestContextHolder.setRequestAttributes(context);
И вот где он появляется:
final DataExportThread dataExportThread =
new myThread(RequestContextHolder.currentRequestAttributes());
final Thread thread = new Thread(myThread);
thread.setUncaughtExceptionHandler((t, e) -> {...});
thread.start();
Насколько я понял, мы храним атрибуты currentRequestAttributes в потоке, а затем, при запуске, восстанавливаем их currentRequestAttributes ...меня, но ошибка все еще там.Я думаю, что сделал ошибку, адаптировав решение для моего случаяМожет быть, кто-то может помочь мне найти ошибку.
До того, как я прошел через много потоков-потоков-потоков с различными решениями (см. ниже), я мог бы попробовать что-то еще, но этот вариант казался наиболее простым и понятным.я, поэтому я надеюсь, что кто-то может помочь мне найти ошибку в реализации или объяснить, почему это неправильный подход.
Я уже пробовал этот безуспех:
Если это важно:
<org.springframework-version>4.3.4.RELEASE</org.springframework-version>
Кстати:Я знаю, что было бы лучше реструктурировать приложение таким образом, чтобы запрос не требовался в потоке, но это очень сложно в этом случае, и я очень надеюсь, что смогу избежать этого.
-
Edit1:
ThBean, который не может быть создан в потоке, начинается следующим образом:
@Service("userRightsService")
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserRightsService {
-
Edit2:
Я также пробовал это:
Но контекст всегда пуст ...