Java 从SpringWeb应用程序中的类路径加载(xml)文件
我想从我的类路径中获取一个xml文件来解组它,并将其用于测试目的。 我的问题是将其作为输入流获取。 我写了这些行,但我总是得到一个空结果Java 从SpringWeb应用程序中的类路径加载(xml)文件,java,spring,classpath,Java,Spring,Classpath,我想从我的类路径中获取一个xml文件来解组它,并将其用于测试目的。 我的问题是将其作为输入流获取。 我写了这些行,但我总是得到一个空结果 InputStream is = getClass().getResourceAsStream("WebContent/WEB-INF/classes/testing/"+ COMPLETE_DOCUMENT + ".xml"); 当然,您在方法参数中看到的路径就是指向我的文件的路径。 我尝试了几种组合: WebContent/WEB-INF/classes
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中,我使用类路径中的一些资源来配置PropertyPlaceHolderConfigure或Jaxb2Marshaller,只需使用语法即可
"classpath:folder/file.xsd"
而且它工作得很好。我想从中加载xml的文件夹是上面示例中的一个文件夹的同级文件夹。
我错过了什么
编辑:
我试图遵循SpringClassPathResourceHelper类的方法,但我得到了一个奇怪的行为:正如我之前所说,我已经在启动时通过一些SpringBean从类路径加载了一些资源。如果我在dardo建议的代码中使用这些资源的路径,如下所示:
ClassPathResource cpr = new ClassPathResource("xmlschemas/lrinode.xsd");
InputStream is = cpr.getInputStream();
我仍然收到一个FileNotFound异常
!
当然,“xmlschemas/lrinode.xsd”
是启动时成功加载的xsd。即使从应用程序的根开始使用资源的完整路径,它也不起作用
我开始觉得我遗漏了一些琐碎的东西。你需要一个你没有尝试过的组合:
getClass().getResourceAsStream("/testing/"+ COMPLETE_DOCUMENT + ".xml");
WebContent/WEB-INF/classes
目录应该已经在类路径上
classpath:
语法只有在使用Spring的ResourceLoader
抽象时才起作用,而不是这样。您在servlet.xml
中对classpath:folder/file.xsd
的使用非常困难,因为Spring正在通过一个ServletContextResourceLoader
传递它,它会自动解析类路径:
。当您用资源名称调用Class.getResourceAsStream()
时,没有前导斜杠,它假定您正在请求与当前包(即调用方类的包)相关的资源。要使其成为绝对资源路径,您需要在资源名称中添加前导斜杠,例如,在您的示例中,“/testing/”+COMPLETE\u DOCUMENT+”.xml“
Spring提供了一个名为ClassPathResource的帮助器类
比如:
ClassPathResource cpr = new ClassPathResource("folder/file.xsd");
InputStream is = cpr.getInputStream();
应该有用,希望这有帮助
链接到API文档:
旁注
此外,如果您将其用于测试目的,则可能需要连接映射到xsd的bean
可能需要研究JAXB封送器
谢谢你的解释,现在雾已经散去了。不幸的是,你建议的解决方案在我的项目中都不起作用。我假设“classes”目录位于classpath中,因为它是由“classpath:”语法定位的,对吗?UH好吧,我承认。我不确定类路径是什么。说起来很尴尬。我假设它是我在PackageExplorer中从eclipse项目的根目录中所能看到的一切。我知道这是一个变量,但我认为eclipse会自动管理它…@maVVamaldo:确保在路径中包含前导斜杠。我在最初的回答几秒钟后补充说。为了完整起见,这正是我尝试的代码片段。InputStream=getClass().getResourceAsStream(“/testing/”+COMPLETE_DOCUMENT+”.xml”);谢谢,我对这个助手班很感兴趣。我尝试了您的解决方案,但仍然得到
“java.io.FileNotFoundException:无法打开类路径资源[testing/sample\u complete\u document.xml],因为它不存在”
异常。文件名是我的类路径中文件的实际名称。另外,我已经在使用JAXB2了,如果xml文档的完整路径是什么?xml文档的完整路径如下:/VirtualResource2/WebContent/WEB-INF/classes/testing/sample\u complete\u document.xml
。当然,“VirtualResource2”是我的web应用程序的名称。编译前的路径是什么?我应该问一下,如果编译前它在web inf文件夹下,对类路径不可见。如果您使用的是maven,请将它放在src/main/resources/test.xml中,那么它将是新的类路径资源(“test.xml”)