从Spring bean获取目录的路径?

时间:2010-03-22 23:41:28

标签: java spring resources

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

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

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

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

2 个答案:

答案 0 :(得分:10)

@All

这些答案的问题是它们变得陈旧,或者当时以多种方式处理的信息并不明显。就像你可能正在使用的旧Atari电脑(笑)一样,事情可能已经改变了!

您只需将@Autowired ServletContext放入您的bean:

@Service
class public MyBean {
    @Autowired ServletContext servletContext=null;

    // Somewhere in the code
    ...
    String filePathToGraphsDir = servletContext.getRealPath("/graphs");

}

答案 1 :(得分:6)

如果您的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仅在请求线程执行时才有效。