#spring #spring-boot #java-11
#spring #spring-boot #java-11
Вопрос:
Я хотел бы создать обзор записей в блоге. Для этого я хочу прочитать html-файлы из папки внутри папки templates в папке resources, где Spring Boot хранит свои шаблоны.
Я пробовал это, но он не возвращает ошибку, но также не содержит списка файлов.
Каким образом здесь можно поступить?
Спасибо
@Controller
public class Route {
@Autowired
private ResourceLoader resourceLoader;
@RequestMapping("/")
public String home() throws IOException {
final String path = "templates/blog";
final Resource res = resourceLoader.getResource("templates/blog");
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(res.getInputStream()))) {
reader.lines().forEachOrdered(System.out::println);
}
return "blog/a";
}
}
Ответ №1:
@Controller
public class Route {
@Value("classpath:templates/blog/*")
private Resource[] resources;
@RequestMapping("/")
public String home() throws IOException {
for (final Resource res : resources) {
System.out.println(res.getFilename());
}
return "blog/a";
}
}
для меня это сработало.
Комментарии:
1. Вы спасли мне день!
Ответ №2:
Вы должны быть в состоянии достичь этого, используя NIO2.
Для того, чтобы NIO2 работал, требуется концепция файловой системы, и ее можно создать из URI jar. Затем эту файловую систему можно использовать с файлами / путями. Приведенный ниже код содержит две ветви — первая обрабатывает загрузку файлов изнутри Jar, вторая ветвь — когда код выполняется из IDE или через "mvn spring-boot:run"
.
Все потоки используются через try-with-resources, поэтому они будут автоматически закрыты.
Функция поиска начинается с верхней части файловой системы и рекурсивно выполняет поиск HTML-файлов.
public static void readFile(String location) throws URISyntaxException {
URI uri = Objects.requireNonNull(ReadFromJar.class.getClassLoader().getResource(location)).toURI();
if (uri.getScheme().equals("jar")) { //inside jar
try (FileSystem fs = FileSystems.newFileSystem(uri, Collections.emptyMap())) { //build a new FS that represents the jar's contents
Files.find(fs.getPath("/"), 10, (path, fileAttr) -> // control the search depth (e.g. 10)
fileAttr.isRegularFile() //match only files
amp;amp; path.toString().contains("blog") //match only files in paths containing "blog"
amp;amp; path.getFileName().toString().matches(".*\.html")) // match only html files
.forEach(ReadFromJar::printFileContent);
} catch (IOException ex) {
ex.printStackTrace();
}
}
else { //from IDE or spring-boot:run
final Path path = Paths.get(uri);
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(path)) {
dirStream.forEach(ReadFromJar::printFileContent);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void printFileContent(final Path file) {
try {
System.out.println("Full path: " file.toAbsolutePath().toString());
Files.lines(file).forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
Комментарии:
1. Я пробовал этот подход, но попробуйте скомпилировать его с помощью maven и запустить с помощью java -jar. Это больше не будет работать, потому что ваш подход работает, только если вы запускаете его локально. Надеюсь, вы понимаете, что я имею в виду.
2. Да, я понял, в чем ваша проблема. Я обновил код для обработки файлов jar с использованием файловых систем
3. Спасибо за вашу помощь, но ваше решение выглядит довольно сложным. Я нашел решение, подобное «spring», с внедрением.