【问题标题】:load a (xml) file from the classpath in a spring web app从 Spring Web 应用程序中的类路径加载(xml)文件
【发布时间】:2012-03-02 16:23:54
【问题描述】:

我想从我的类路径中获取一个 xml 文件来解组它并将其用于测试目的。 我的问题是将它作为 InputStream 获取。 我写了这些行,但我总是得到一个空结果。

InputStream is = getClass().getResourceAsStream("WebContent/WEB-INF/classes/testing/"+ COMPLETE_DOCUMENT + ".xml");

当然,您在方法参数中看到的路径是我的文件的路径。 我尝试了几种组合:

WebContent/WEB-INF/classes/testing/
classpath:testing/
classpath*:testing/

但我总是得到 InputStream = null。

我什至尝试切换到

 ClassLoader.getResourceAsStream(...)

但什么也没发生。我想资源的路径在某种程度上是错误的,但我不知道在哪里。从我的 servlet.xml 中,我使用类路径中的一些资源来配置 PropertyPlaceholderConfigurer 或 Jaxb2Marshaller,仅使用语法

"classpath:folder/file.xsd"

而且效果很好。我要从中加载我的 xml 的文件夹是上面示例中的同级文件夹。 我错过了什么?

编辑: 我尝试遵循 spring ClassPathResource helper 类方法,但我得到了一个奇怪的行为:正如我之前所说,我已经在启动时通过一些 spring bean 从类路径加载了一些资源。如果我在 dardo 建议的代码中使用此类资源的路径,如下所示:

ClassPathResource cpr = new ClassPathResource("xmlschemas/lrinode.xsd");
InputStream is = cpr.getInputStream();

我仍然收到FileNotFound Exception! 当然"xmlschemas/lrinode.xsd"是我在启动时成功加载的xsd。即使我使用资源的完整路径(从应用程序的根目录开始),它也不起作用。

我开始认为我错过了一些微不足道的事情。

【问题讨论】:

    标签: java spring classpath


    【解决方案1】:

    Spring 提供了一个名为 ClassPathResource 的辅助类

    比如:

    ClassPathResource cpr = new ClassPathResource("folder/file.xsd");
    InputStream is = cpr.getInputStream();
    

    应该可以,希望对你有帮助!

    API 文档链接: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/core/io/ClassPathResource.html

    旁注

    另外,如果您将它用于测试目的,可能需要连接一个映射到 xsd 的 bean。

    可能想研究一个 JAXB 编组器

    http://static.springsource.org/spring-ws/site/reference/html/oxm.html#oxm-jaxb2-xsd

    【讨论】:

    • 谢谢,我对这个助手类很感兴趣。我尝试了您的解决方案,但我仍然收到"java.io.FileNotFoundException: class path resource [testing/sample_complete_document.xml] cannot be opened because it does not exist" 异常。文件名是我的类路径中文件的实际名称。 PS。我已经使用 JAXB2 ^__^
    • xml 文档的完整路径是什么
    • xml文档的完整路径如下:/VirtualResource2/WebContent/WEB-INF/classes/testing/sample_complete_document.xml。当然,“VirtualResource2”是我的网络应用程序的名称。
    • 编译之前的路径是什么我应该问一下,如果它在你编译之前的 web-inf 文件夹下,它对类路径不可见
    • 如果你使用的是 maven,把它放在 src/main/resources/test.xml 然后它会是 new classpathresource("test.xml")
    【解决方案2】:

    你需要一个你没有尝试过的组合:

    getClass().getResourceAsStream("/testing/"+ COMPLETE_DOCUMENT + ".xml");
    

    WebContent/WEB-INF/classes 目录应该已经在类路径中。

    classpath: 语法仅在您使用 Spring 的 ResourceLoader 抽象时才有效,而您不是。您在 servlet.xml worpks 中使用 classpath:folder/file.xsd 是因为 Spring 将它传递给 ServletContextResourceLoader,它会自动解析 classpath:

    【讨论】:

    • 感谢您的解释,现在迷雾散去。不幸的是,您建议的解决方案都不适用于我的项目。我想“类”目录位于类路径中,因为它位于“类路径:”语法中,适用于 spring 上下文,对吧?呃……好吧,我承认。我不确定类路径的精确度是什么。很尴尬的说。我认为这是我可以从包资源管理器中的 Eclipse 项目的根目录中看到的所有内容。我知道它是一个变量,但我认为 eclipse 会自动管理它...
    • @maVVamaldo:确保在路径中包含前导斜杠。我在最初回答几秒钟后添加了它。
    • 为了完整起见,这是我尝试过的确切代码片段。 InputStream 是 = getClass().getResourceAsStream("/testing/"+ COMPLETE_DOCUMENT + ".xml");
    【解决方案3】:

    当您使用不带斜杠的资源名称调用Class.getResourceAsStream() 时,它假定您正在请求相对于当前包(即调用者类的包)的资源。要使其成为绝对资源路径,您需要在资源名称中添加前导斜杠,例如在你的情况下"/testing/"+ COMPLETE_DOCUMENT + ".xml"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多