I'm using Spring 3. When controller gets requests it passes control to method someMethod()
annotated with @Async
in Service bean and then returns. When I access in someMethod()
HttpSession object I receive this exception
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.
How can I resolve this?
The
HttpSession
object itself can be used in multiple threads (but is not thread-safe and therefore must be synchronized). However Spring is doing some extra magic e.g. when you havesession
-scoped beans. Namely it usesThreadLocal
underneath to bind current session with thread.I don't know what is your exact scenario, but apparently Spring tries to retrieve
HttpSession
from thisThreadLocal
while you are in another thread - which obviously fails.The solution is simple - extract session attributes you need in
@Async
method and pass them directly. This is by the way much better design - avoid passingHttpSession
object around because it makes testing harder and your code is much less likely to be reused in the future.