[SPRING] 원래 수신 스레드 외부에서 HttpSession에 액세스
SPRING원래 수신 스레드 외부에서 HttpSession에 액세스
저는 Spring 3을 사용하고 있습니다. 컨트롤러가 요청을 받으면 Service 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 객체 자체는 여러 스레드에서 사용할 수 있지만 (스레드로부터 안전하지 않으므로 동기화해야합니다) 그러나 봄은 약간의 특별한 마술을하고있다. 세션 범위의 bean이있을 때. 즉 ThreadLocal을 사용하여 현재 세션을 스레드와 바인드합니다.
HttpSession 객체 자체는 여러 스레드에서 사용할 수 있지만 (스레드로부터 안전하지 않으므로 동기화해야합니다) 그러나 봄은 약간의 특별한 마술을하고있다. 세션 범위의 bean이있을 때. 즉 ThreadLocal을 사용하여 현재 세션을 스레드와 바인드합니다.
나는 정확한 시나리오가 무엇인지 모르지만 분명히 Spring은 다른 스레드에있는 동안이 ThreadLocal에서 HttpSession을 검색하려고 시도한다. 분명히 실패한다.
솔루션은 간단합니다. @Async 메서드에서 필요한 세션 특성을 추출하고 직접 전달합니다. 이것은 훨씬 더 나은 디자인입니다 - HttpSession 객체를 전달하는 것을 피하십시오. 왜냐하면 테스트가 더 어려워지고 코드가 미래에 재사용 될 가능성이 훨씬 적기 때문입니다.
from https://stackoverflow.com/questions/10473254/accessing-httpsession-outside-of-the-originally-receiving-thread by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 주석 속성의 값은 상수 표현이어야합니다. (0) | 2019.05.12 |
---|---|
[SPRING] Spring Batch - TaskletStep에서 건너 뛸 수있는 예외 (0) | 2019.05.12 |
[SPRING] 봄 MVC 게시물 요청 (0) | 2019.05.12 |
[SPRING] http2 요청을하기 위해 Spring의 RestTemplate을 구성하는 방법은 무엇입니까? (0) | 2019.05.12 |
[SPRING] 최대 절전 모드 자바 10 (0) | 2019.05.12 |