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
HttpSessionobject 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 usesThreadLocalunderneath to bind current session with thread.I don’t know what is your exact scenario, but apparently Spring tries to retrieve
HttpSessionfrom thisThreadLocalwhile you are in another thread – which obviously fails.The solution is simple – extract session attributes you need in
@Asyncmethod and pass them directly. This is by the way much better design – avoid passingHttpSessionobject around because it makes testing harder and your code is much less likely to be reused in the future.