Доступ к HttpSession вне первоначально полученного потока

Я использую Spring 3. Когда контроллер получает запросы, он передает управление методуsomeMethod() с пометкой@Async в служебном бине, а затем возвращается. Когда я получаю доступ вsomeMethod() HttpSession объект Я получаю это исключение

<code>java.lang.IllegalStateException: No thread-bound request found: Are you 
referring to request attributes outside of an actual web request, or 
processing a request outside of the originally receiving thread? If you are 
actually operating within a web request and still receive this message, your 
code is probably running outside of DispatcherServlet/DispatcherPortlet: In 
this case, use RequestContextListener or 
RequestContextFilter to expose the current request.
</code>

Как я могу решить это?

Ответы на вопрос(1)

Решение Вопроса

HttpSessionам объект @ может использоваться в нескольких потоках (но этон потокобезопасен и поэтому должен быть синхронизирован). Тем не менее, весна делает некоторую дополнительную магию, например когда у тебя естьsession -обеденные бобы. А именно используетThreadLocal внизу, чтобы связать текущий сеанс с потоком.

Я не знаю, каков твой сценарий, но, видимо, Spring пытается найтиHttpSession из этогоThreadLocal пока ты в другой ветке - что явно не получается.

Решение простое - извлеките нужные атрибуты сессии в@Async метод и передать их напрямую. Это, кстати, намного лучший дизайн - избегайте прохожденияHttpSession возражать, потому что это усложняет тестирование, и ваш код с меньшей вероятностью будет повторно использован в будущем.

 mjaggard30 дек. 2015 г., 09:39
Но как насчет УСТАНОВКИ вещей на сессии? Есть ли у вас документация, подтверждающая ваше утверждение о том, что вы можете получить доступ к HttpSession вне запроса?
 Oleksandr Bondarenko06 мая 2012 г., 22:51
Ваше решение простое и хорошее, но тогда где я могу хранить пользовательские данные, если они мне нужны не только на уровне контроллера, но также на уровне бизнеса и данных? Или я должен передать эти данные через аргументы метода? Это единственное решение?
 Tomasz Nurkiewicz06 мая 2012 г., 22:57
@ OleksandrBondarenko: Подумайте об этом - открывая сеанс на уровне сервисов, вы вводите скрытую связь и неявную зависимость. Передача всех этих данных через аргументы (возможно, оборачивая их в некоторый объект) - действительно лучший вариант.

Ваш ответ на вопрос