java在最初接收线程之外访问HttpSession
我用的是Spring3。当控制器收到请求时,它将控制权传递给服务bean中用@Async
注释的方法someMethod()
,然后返回。当我在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.
我如何解决这个问题
# 1 楼答案
HttpSession
对象本身可以在多个线程中使用(但不是线程安全的,因此必须同步)。然而,Spring正在发挥一些额外的魔力,例如,当你拥有session
范围的bean时。也就是说,它使用下面的ThreadLocal
将当前会话与线程绑定我不知道您的具体场景是什么,但显然Spring试图在您处于另一个线程时从这个
ThreadLocal
中检索HttpSession
,这显然失败了解决方案很简单——在
@Async
方法中提取所需的会话属性,并直接传递它们。顺便说一句,这是更好的设计——避免传递HttpSession
对象,因为这会使测试变得更困难,而且代码在未来被重用的可能性也会大大降低