我有一个看似简单的问题。我有一个部署在Tomcat中的Spring Web应用程序。在服务类中,我希望能够在应用程序根目录下将新文件写入名为graphs的目录:

/
   /WEB-INF
   /graphs/
   /css/
   /javascript/

我的服务类是Spring bean,但是我无法通过HttpServlet机制直接访问ServletContext。我也尝试实现ResourceLoaderAware,但似乎仍无法抓住我需要的东西。

如何使用Spring获取应用程序中目录的句柄,以便可以向其中写入文件?谢谢。

最佳答案

如果您的bean是由webapp的spring上下文管理的,则可以实现ServletContextAware,Spring会将ServletContext注入到您的bean中。然后,您可以向ServletContext询问给定资源的实际文件系统路径,例如

String filePathToGraphsDir = servletContext.getRealPath("/graphs");

如果您的bean不在webapp上下文中,那么它会变得很丑陋,可能会起作用:
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
String pathToGraphsDir = requestAttributes.getRequest().getRealPath("/graphs");

尽管使用了不推荐使用的ServletRequest.getRealPath方法,但它仍然可以工作,尽管RequestContextHolder仅在由请求线程执行时才有效。

07-24 19:35