비동기 메소드 HttpServletRequest 이슈 해결

@Async로 선언된 비동기 메소드를 호출했다. 메소드는 해당 클래스에 @Autowired된 HttpServletRequest로 부터 정보를 가져오다가 SimpleAsyncUncaughtExceptionHandler.handleUncaughtException() 예외가 발생했다.

No thread-bound request found: Are you referring to request attributesoutside of an actual web request, or processing a request outside of theoriginally receiving thread.

원인은 비동기 처리시 다른 스레드에서 동작하기 때문이다.

해결방안

  • request로 부터 필요한 정보를 메소드의 파라미터로 전달한다.
  • 다음과 같이 RequestContextHolder에서 현재 HttpServletRequest를 가져온다.
// WebApplicationInitializer 설정에 리스너 추가
servletContext.addListener(new RequestContextListener());

ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = attr.getRequest();


'Development > Spring' 카테고리의 다른 글

DatabaseConfiguration 적용  (0) 2018.08.17
Configuration Condition  (0) 2018.07.16
multiple 'X-Frame-Options' headers with conflicting 에러  (0) 2017.12.15
비동기 어노테이션  (0) 2017.11.25
캐시 어노테이션  (0) 2017.10.06

+ Recent posts