tomcat Java -如何在不使用servlet上下文的情况下访问WEB-INF文件夹中的文件

uqjltbpv  于 2022-11-13  发布在  Java
关注(0)|答案(3)|浏览(195)

我有一个中心类(RuntimeConfiguration),它保存了我的应用程序的100参数。这些参数取自我存储在WEB-INF文件夹中的一个 *XML文件 *。在我的开发盒中,我硬编码了路径,但由于非常明显的原因,这不是一个高效的解决方案。
出于可移植性的原因(我的应用程序可能在 TomcatJetty 上以及Windows或Unix下执行),我希望从我的RuntimeConfiguration类中对该文件有一个通用的访问方式。
我知道,如果我有一个servlet,我可以使用getRealPath,但是RuntimeConfiguration不是在 *servlet上下文 * 中启动的。它是从一个作业(一个爬虫)中调用的,而这个作业又是通过applicationContext.xml从quartz作业控制中启动的。现在这似乎是我的问题的核心。
有人能告诉我,如何在这个环境中获得XML的绝对路径吗?
我尝试了这种ClassLoader方法,但得到的结果是NullPointerException

ClassLoader loader = this.getClass().getClassLoader();
loader.getResource("WEB-INF");
result = loader.getSystemResource(RTCF).toString();

我也试过

URL url = this.getClass().getClassLoader().getResource("WEB-INF");

也会抛出空指针异常
有没有人能给予我一个可移植的解决方案,一个可以在我的开发机器上和我的应用程序作为WAR文件部署的生产系统上工作的解决方案?
顺便说一句,该方法最多只能处理基于Windows和MacOSX/ Unix的系统。

inkz8wg9

inkz8wg91#

您始终可以使用 * 保持器 * 模式:创建一个类,它有一个包含WEB-INF目录的真实的路径的静态字段(带有静态getter)。
在根Spring应用程序上下文中创建该保持器类的一个示例,Spring为它提供一个指向ApplicationContext的指针,该指针将是一个WebApplicationContext,就像您在Web应用程序中一样。
在init方法中,使用WebApplicationContext获取路径并将其存储在static字段中。由于有了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()
编辑:
使用完整路径可能无法在不会引发战争的生产服务器上工作。* 如果servlet容器无法将给定的虚拟路径转换为真实的路径,则此方法返回null *。但在这种情况下,您始终可以使用ServletContext.getResource()ServletContext.getResourceAsStream()访问作为资源的文件

z6psavjg

z6psavjg2#

在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 - Spring Docs

qnzebej0

qnzebej03#

只需将其放在类路径中,并使用“getResourcesAsStream()"加载它,或者最好将其设置为一个“.properties”文件,并以通常的方式加载它:

ResourceBundle config = ResourceBundle.getBundle("filename");

相关问题