Spring Boot доступ к статическим ресурсам отсутствует scr / main / resources

Я работаю над приложением Spring Boot. Мне нужно сначала разобрать XML-файл (country.xml). Проблема в том, что я не понимаю, куда его положить, чтобы получить к нему доступ. Структура моих папок

ProjectDirectory/src/main/java
ProjectDirectory/src/main/resources/countries.xml

Моя первая идея заключалась в том, чтобы поместить его в src / main / resources, но когда я пытаюсь создать файл (country.xml), я получаю NPE, и трассировка стека показывает, что мой файл просматривается в ProjectDirectory (поэтому src / main / resources / не добавляется). Я попытался создать файл (resources / countries.xml), и путь будет выглядеть как ProjectDirectory / resources / countries.xml (так что снова src / main не добавляется).

Я пробовал добавить это безрезультатно

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    super.addResourceHandlers(registry);
}

Я знаю, что могу добавить src / main / вручную, но хочу понять, почему он не работает должным образом. Я также пробовал примеры с ResourceLoader - безрезультатно.

Может ли кто-нибудь подсказать, в чем проблема?

ОБНОВЛЕНИЕ: на всякий случай. После создания проекта у меня возникла проблема с доступом к файлу, поэтому я изменил File на InputStream.

InputStream is = new ClassPathResource("countries.xml").getInputStream();

person lenach87    schedule 02.04.2016    source источник
comment
Вы добавляете этот файл в свой web.xml или любой другой файл конфигурации, чтобы сообщить приложению, что он существует?   -  person LearningPhase    schedule 02.04.2016
comment
Только добавление файла в папку не поможет приложению сканировать файл   -  person LearningPhase    schedule 02.04.2016
comment
У меня нет web.xml, у меня конфигурация на основе Java. Не могли бы вы посоветовать мне, что я должен учитывать? Может у вас есть образец? Буду очень благодарен !!!   -  person lenach87    schedule 02.04.2016
comment
Хорошая рекомендация от luboskrnac   -  person LearningPhase    schedule 02.04.2016
comment
Для решения на основе аннотаций: stackoverflow.com/a/39472514/159837   -  person Fırat KÜÇÜK    schedule 21.03.2017
comment
Это сработало для меня, используя File file = new File (sampleFile), а SpringBoot никогда не находил его в моей папке resources / static. Спасибо за предложение!   -  person Robert Cadmire    schedule 12.03.2019


Ответы (8)


Просто используйте тип Spring ClassPathResource .

File file = new ClassPathResource("countries.xml").getFile();

Пока этот файл находится где-то в пути к классам, Spring его найдет. Это может быть src/main/resources во время разработки и тестирования. В производственной среде это может быть текущий рабочий каталог.

РЕДАКТИРОВАТЬ: Этот подход не работает, если файл находится в толстом JAR. В таком случае вам необходимо использовать:

InputStream is = new ClassPathResource("countries.xml").getInputStream();
person luboskrnac    schedule 02.04.2016
comment
Огромное спасибо!! Это меня действительно спасло! Теперь он работает так, как ожидалось - person lenach87; 02.04.2016
comment
как преобразовать этот файл в JSonObejct? (сначала данные JSONobject) - person Mahdi; 03.06.2017
comment
Просто чтобы добавить к ответу @luboskrnac, также попробуйте использовать File file = new ClassPathResource(".\countries.xml").getFile(); - person Rahul Jawale; 08.11.2017
comment
Согласно этому ответу resource.getFile() ожидает, что файл находится в реальной файловой системе, и это решение не работает внутри JAR для доступ к ресурсам, хранящимся в src/main/resources. Я подтвердил это с помощью простого приложения Spring Boot. - person smeeb; 12.01.2018
comment
@smeeb Спасибо. Использование InputStream inputStream = new ClassPathResource("countries.xml").getInputStream(); - вот что сработало для меня - person TrueKojo; 11.05.2019
comment
Обновите свой ответ в соответствии с ответом smeeb, так как это спасет очень много жизней. - person Emdadul Sawon; 11.11.2019

Чтобы получить файлы в пути к классам:

Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();

Чтобы прочитать файл при запуске, используйте @PostConstruct:

@Configuration
public class ReadFileOnStartUp {

    @PostConstruct
    public void afterPropertiesSet() throws Exception {

        //Gets the XML file under src/main/resources folder
        Resource resource = new ClassPathResource("countries.xml");
        File file = resource.getFile();
        //Logic to read File.
    }
}

Вот Маленький пример чтения файла XML при запуске приложения Spring Boot.

person Sanjay Rawat    schedule 02.04.2016
comment
Спасибо за ответ! Меня спасла первая часть, как подсказываете вы и luboskrnac! - person lenach87; 02.04.2016
comment
@ElenaChubukina Взгляните на образец примера. Вы сказали, что вам нужно разобрать xml при запуске .... - person Sanjay Rawat; 02.04.2016
comment
Спасибо! Часть с файлом синтаксического анализа не была проблемой (только часть с поиском файла по пути к классам) - я использую CommandLineRunner, у меня он отлично работает - person lenach87; 03.04.2016

При работе с приложением Spring Boot трудно получить ресурсы пути к классам, используя resource.getFile(), когда оно развернуто как JAR, поскольку я столкнулся с той же проблемой. Это сканирование будет разрешено с помощью Stream, который обнаружит все ресурсы, размещенные в любом месте пути к классам.

Ниже приведен фрагмент кода для того же -

ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);
person Sachchidanand Singh    schedule 13.04.2018
comment
Оно работает. Еще одна вещь, пожалуйста, используйте зависимость: ‹dependency› ‹groupId› commons-io ‹/groupId› ‹artifactId› commons-io ‹/artifactId› ‹version› 2.6 ‹/version› ‹/dependency› в приложении Springboot. Старая функция toString устарела. Вам необходимо использовать новую версию: IOUtils.toString (inputStream, UTF-8) - person AI_ROBOT; 30.08.2018

Я использую пружинную загрузку, поэтому могу просто использовать:

File file = ResourceUtils.getFile("classpath:myfile.xml");
person Galley    schedule 21.01.2019

Вам нужно использовать следующую конструкцию

InputStream in = getClass().getResourceAsStream("/yourFile");

Обратите внимание, что перед именем файла необходимо добавить косую черту.

person Andrew Gans    schedule 18.06.2018

Вы можете использовать следующий код для чтения файла в строке из папки ресурсов.

final Resource resource = new ClassPathResource("public.key");
String publicKey = null;
try {
     publicKey = new String(Files.readAllBytes(resource.getFile().toPath()), StandardCharsets.UTF_8);
} catch (IOException e) {
     e.printStackTrace();
}
person Sanjay Sharma    schedule 21.10.2018

Я использую Spring Boot, мое решение проблемы было

"src/main/resources/myfile.extension"

Надеюсь, это кому-то поможет.

person Nemanja Rajkovic    schedule 04.03.2019

Поскольку java.net.URL не подходит для обработки всех видов низкоуровневых ресурсов, Spring представила org.springframework.core.io.Resource. Для доступа к ресурсам мы можем использовать аннотацию @Value или класс ResourceLoader. @Autowired частный ResourceLoader resourceLoader;

@Override public void run (String ... args) выдает исключение {

    Resource res = resourceLoader.getResource("classpath:thermopylae.txt");

    Map<String, Integer> words =  countWords.getWordsCount(res);

    for (String key : words.keySet()) {

        System.out.println(key + ": " + words.get(key));
    }
}
person ramakotireddy nagireddy    schedule 22.10.2019