4

私はSpring 3を使用しています。コントローラーがリクエストをsomeMethod()受け取ると、サービスBeanで注釈が付けられたメソッドに制御を渡してから@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スコープされたBeanがある場合など、追加の魔法を実行しています。つまり、ThreadLocalunderを使用して、現在のセッションをスレッドにバインドします。

正確なシナリオはわかりませんが、別のスレッドにいるときにSpringがこれから取得しようとしているようですが、明らかに失敗しますHttpSessionThreadLocal

解決策は簡単です。メソッドで必要なセッション属性を抽出し@Async、それらを直接渡します。HttpSessionちなみに、これははるかに優れた設計です。テストが難しくなり、コードが将来再利用される可能性がはるかに低くなるため、オブジェクトを渡すことは避けてください。

于 2012-05-06T19:00:50.690 に答える