Загрузить файл (xml) из пути к классам в веб-приложении spring

Я хотел бы взять 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, и я получаю странное поведение: как я уже сказал, у меня уже есть некоторые ресурсы, загруженные из пути к классам с помощью spring beans при запуске. Если я использую путь к таким ресурсам в коде, предложенном dardo, следующим образом:

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

Я все еще получаю FileNotFound Exception! Конечно, "xmlschemas/lrinode.xsd" - это загрузка xsd я при запуске. Он не работает, даже если я использую полный путь к ресурсу, начиная с корня приложения.

Я начинаю думать, что мне не хватает чего-то тривиального.

Ответ 1

Spring предоставляет вспомогательный класс с именем ClassPathResource

Так что-то вроде:

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

Должен работать, надеюсь, что это поможет!

Ссылка на API Doc: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/core/io/ClassPathResource.html

Sidenote

Кроме того, если вы используете его для тестирования, возможно, потребуется подключить bean к xsd.

Возможно, вы захотите посмотреть маршаллер JAXB

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

Ответ 2

Вам нужна комбинация, которую вы не пробовали:

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

Каталог WebContent/WEB-INF/classes должен уже находиться в пути к классам.

Синтаксис classpath: работает только в том случае, если вы используете абстракцию Spring ResourceLoader, которой вы не являетесь. Использование classpath:folder/file.xsd в servlet.xml woprks, потому что Spring передает его через ServletContextResourceLoader, который автоматически разрешает classpath:.

Ответ 3

Когда вы вызываете Class.getResourceAsStream() с именем ресурса без ведущей косой черты, предполагается, что вы запрашиваете ресурс относительно текущего пакета (т.е. пакета класса вызывающего абонента). Чтобы сделать это абсолютным путем ресурса, вам нужно добавить ключевое слово slash для имени ресурса, например. в вашем случае "/testing/"+ COMPLETE_DOCUMENT + ".xml"