Подтвердить что ты не робот

Spring Загрузочный доступ к статическим ресурсам отсутствует scr/main/resources

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

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

Моя первая идея заключалась в том, чтобы поместить его в src/main/resources, но когда я пытаюсь создать File (countries.xml), я получаю NPE, а stacktrace показывает, что мой файл просматривается в 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 - с тем же результатом.

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

UPDATE: Только для будущих ссылок - после создания проекта у меня возникла проблема с доступом к файлу, поэтому я изменил файл на InputStream

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

Ответ 1

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

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

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

Ответ 2

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

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

ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);

Ответ 3

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

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

Чтобы прочитать файл onStartup, используйте @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 Запуск загрузки приложения.

Ответ 4

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

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();
}

Ответ 5

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

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

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

Ответ 6

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

File file = ResourceUtils.getFile("classpath:myfile.xml");