загрузить файл (xml) из пути к классам в весеннем веб-приложении - PullRequest
11 голосов
/ 02 марта 2012

Я бы хотел взять xml-файл из моего classpath, чтобы разархивировать его и использовать для тестирования.Моя проблема состоит в том, чтобы получить его как 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, является родственной той, что в примере выше.Чего мне не хватает?

РЕДАКТИРОВАТЬ: Я пытаюсь следовать подходу весеннего вспомогательного класса ClassPathResource и получаю странное поведение: как я уже говорил ранее, некоторые ресурсы уже загружены из classpathнекоторые весенние бобы при запуске.Если я использую путь к таким ресурсам в коде, предложенном dardo, следующим образом:

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

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

Я начинаю думать, что упускаю что-то тривиальное.

Ответы [ 3 ]

20 голосов
/ 02 марта 2012

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

3 голосов
/ 02 марта 2012

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

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

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

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

0 голосов
/ 02 марта 2012

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

...