Список файлов из каталога Templates в Spring Boot

#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», с внедрением.