编程语言
首页 > 编程语言> > java如何在没有servlet上下文的情况下访问WEB-INF文件夹中的文件

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