Accessing HttpSession outside of the originally receiving thread

asynchronous, httpsession, java, spring

Solution

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 have `session`-scoped beans. Namely it uses `ThreadLocal` underneath to bind current session with thread.

I don't know what is your exact scenario, but apparently Spring tries to retrieve `HttpSession` from this `ThreadLocal` 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 passing `HttpSession` object around because it makes testing harder and your code is much less likely to be reused in the future.

Problem

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?

Original source