4

我正在使用 Spring 3。当控制器收到请求时,它会将控制权传递给在 Service bean 中someMethod()使用注释的方法@Async,然后返回。当我访问someMethod()HttpSession 对象时,我收到此异常

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.

我该如何解决这个问题?

4

1 回答 1

3

HttpSession对象本身可以在多个线程中使用(但不是线程安全的,因此必须同步)。然而 Spring 正在做一些额外的魔法,例如当你有session-scoped bean 时。即它ThreadLocal在下面使用将当前会话与线程绑定。

我不知道您的确切情况是什么,但显然 Spring会在您处于另一个线程中时尝试从中检索 - 这显然失败了HttpSessionThreadLocal

解决方案很简单 - 在方法中提取您需要的会话属性@Async并直接传递它们。顺便说一句,这是更好的设计 - 避免传递HttpSession对象,因为它使测试更加困难,并且您的代码将来被重用的可能性要小得多。

于 2012-05-06T19:00:50.690 回答