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();
Ответы
Ответ 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");