项目中在做一个定时任务,发送邮件的过程中,使用request获取文件模板路径的过程中,发现request获取失败,由于在测试时候是前端触发的,所以在获取request时候,并未发现异常,当触发自动跑批时候,发现request获取失败
1.在尝试使用静态获取和使用直接注入HttpServletRequest的办法,都没有解决问题,会抛出如下异常:
ERROR [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler]
- Unexpected error occurred in scheduled task.
2、使用@Autowired注入HttpServletRequest,会抛出如下异常:
ava.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.
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
at org.springframework.web.context.support.WebApplicationContextUtils.currentRequestAttributes(WebApplicationContextUtils.java:273)
问题解决:
通过ContextLoader获取getCurrentWebApplicationContext方法解决
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext = webApplicationContext.getServletContext();
String realPath = servletContext.getRealPath(File.separator);