我从昨天开始搜索互联网,但我似乎无法应对手头的任务。我有一个中心类(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,基督教
答案 0 :(得分:1)
您始终可以使用 holder 模式:创建一个类,其中包含静态字段(带有静态getter),该字段将包含WEB-INF
目录的实际路径。该课程应该实现ApplicationContextAware
你在root spring应用程序上下文中创建了这个holder类的一个实例,Spring给它一个指向ApplicationContext的指针,它将是你在web应用程序中的WebApplicationContext
。
在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()
答案 1 :(得分:0)
在Spring Web应用程序中,除非在Web应用程序上下文中将某个类声明为bean,否则无法获取上下文路径。在RuntimeConfiguration
类
@Autowired
private ServletContext servletContext;
public {desired returnType} getDirectoryPath(){
File webInfPath = new File(this.getClass().getClassLoader().getResource("WEB-INF"));
// OR use getResourceAsStream() method
InputStream is = RuntimeConfiguration.class.getClassLoader().getResourceAsStream("WEB-INF");
}
或
如果您不想进行自动装配,那么您可以使用ServletContextAware接口实现RuntimeConfiguration。如下所示,在此类中获取servlet上下文对象: -
public class RuntimeConfiguration implements ServletContextAware {
private ServletContext context;
private ServletConfig config;
@Override
public void setServletContext(final ServletContext servletContext) {
this.context = servletContext;
}
public ServletContext getServletContext()[
return context;
}
//do other tasks
}
或强>
查看 ServletContextResource ServletContextResource - Spring Docs
答案 2 :(得分:0)
只需将它放在类路径中并使用" getResourcesAsStream()"加载它,或者更好地使它成为" .properties" -file并按常规方式加载它:
ResourceBundle config = ResourceBundle.getBundle("filename");