java如何在没有servlet上下文的情况下访问WEB-INF文件夹中的文件
作者:互联网
我从昨天开始搜索互联网,但我似乎无法应对手头的任务.我有一个中心类(RuntimeConfiguration),它为我的应用程序保存了大约100个参数.这些参数取自我存储在WEB-INF文件夹中的XML文件.在我的开发盒上,我对路径进行了硬编码,但由于非常明显的原因,这不是一个有效的解决方案.
出于可移植性的原因(我的应用程序可能在tomcat或Jetty上以及在Windows或Unix下执行),我想从RuntimeConfiguration类中获得对该文件的通用访问方式.
我知道,如果我有一个servlet,我可以使用getRealPath,但是不能在servlet上下文中启动RuntimeConfiguration.它是从作业(爬虫)调用的,而作业又是通过applicationContext.xml从石英作业控制启动的.现在这似乎是我问题的核心.
任何人都可以告诉我,如何在这种环境中获得我的XML的绝对路径?
我尝试了这种ClassLoader方法,但它给了我一个空指针异常:
ClassLoader loader = this.getClass().getClassLoader();
loader.getResource("WEB-INF");
result = loader.getSystemResource(RTCF).toString();
我也试过了
URL url = this.getClass().getClassLoader().getResource("WEB-INF");
这也会抛出空指针异常
任何人都可以给我一个便携式解决方案,一个适用于我的开发机器和生产系统,我的应用程序部署为WAR文件???顺便说一下,该方法最多应该能够处理基于Windows和Mac OS X / Unix的系统.
Thabks提前,
基督教
解决方法:
您始终可以使用holder模式:使用静态字段(带有静态getter)创建一个类,该字段将包含WEB-INF目录的实际路径.该类应该实现ApplicationContextAware
您在root spring应用程序上下文中创建了这个holder类的一个实例,Spring为它提供了一个指向ApplicationContext的指针,它将成为WebApplicationContext,就像您在Web应用程序中一样.
在init方法中,使用WebApplicationContext获取路径并将其存储在静态字段中.感谢Spring,您确信该方法只在应用程序真正启动之前调用一次.
现在,您想要获取路径的应用程序中的任何位置,您都可以通过调用静态getter来使用它.
public class ResourcePathHolder implements ApplicationContextAware, InitializingBean{
private WebApplicationContext wac;
private static String resourcePath;
private static ServletContext sc;
private String path = "WEB-INF";
public static String getResourcePath() {
return resourcePath;
}
public static ServletContext getServletContext() {
return sc;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
wac = (WebApplicationContext) applicationContext;
}
public void setPath(String path) {
this.path = path;
}
@Override
public void afterPropertiesSet() throws Exception {
ResourcePathHolder.sc = wac.getServletContext();
ResourcePathHolder.resourcePath = sc.getRealPath(path);
}
}
此实现还允许您访问ServletContext以允许您使用ServletContext.getResource()
编辑:
使用完整路径可能无法在不会爆炸战争的生产服务器上运行.从ServletContext.getRealPath()的javadoc:如果servlet容器无法将给定的虚拟路径转换为实际路径,则此方法返回null.但在这种情况下,您始终可以使用ServletContext.getResource()或ServletContext.getResourceAsStream()作为资源访问这些文件.
标签:java,spring,tomcat,web-inf 来源: https://codeday.me/bug/20190708/1403246.html