Thymeleaf не может получить доступ к атрибуту модели, если приложение springboot упаковано как jar - PullRequest
0 голосов
/ 13 марта 2019

Я строю проект весенней загрузки с тимелистом.Проект выполняется, как и ожидалось, при запуске из затмения.т.е. я могу получить доступ к атрибутам модели в thymeleaf.

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

1) Javaкод на сервере:

@RequestMapping("/")
public String index(Model model) throws Exception {

    String headshotsfileNameStrings = "";
    InputStream resource = new ClassPathResource("static/images/xyz-headshots/").getInputStream();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) {
         headshotsfileNameStrings = reader.lines().collect(Collectors.joining(","));
    }

    model.addAttribute("headshotsfileNameStrings", headshotsfileNameStrings);
    System.out.println(model);
    return "index";
}

РЕДАКТИРОВАТЬ 1: Я обновил код выше:

    try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) {

System.out.println(reader.readLine()); //This prints 'null' when running application as a Jar 

         headshotsfileNameStrings = reader.lines().collect(Collectors.joining(","));
    }

2) Код внешнего интерфейса Thymeleaf

<script>
        var headshotsfileNameStrings = "[[${headshotsfileNameStrings}]]";
    </script>

Переменная 'headshotsfileNameStrings' имеет значение "", когда приложение запускается как jar-файл Springboot, и имеет значение "some_string_here_xyz", когда приложение запускается из Eclipse.

Что здесь может происходить?Я не вижу ошибок и не знаю, с чего начать отладку.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Этот код работал для меня в IDE, а также когда приложение запускалось как JAR:

@RequestMapping("/")
    public String index(Model model) {
        String headshotsfileNameStrings = "";
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        Resource[] resources;
        try {
            resources = ResourcePatternUtils.getResourcePatternResolver(resourceLoader)
                    .getResources("classpath:" + "/static/images/xyz-headshots/*.jpg"); //get all files in the directory
            for (int i = 0; i < resources.length; i++) {
                String fileName = resources[i].getFilename(); //fileName gets populated now.
                headshotsfileNameStrings += fileName + ",";
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

        model.addAttribute("headshotsfileNameStrings", headshotsfileNameStrings);
        return "index";
    }

Я получил помощь из ответов, перечисленных здесь: Ресурс Classpath не найден при запуске в качестве jar

0 голосов
/ 13 марта 2019

Моя первая проверка будет, если файл действительно найден, вы можете поставить точку отладки и посмотреть, действительно ли значение вашего ресурса содержит ожидаемый файл.

Кроме того, добавьте выражение catch и напечатайте трассировку стека вместо использования throws Exception, прямо сейчас, если что-то пойдет не так в этом методе, оно делает это молча.

Я считаю, что в данный момент происходит то, что у вас не найден файл IOException, но вы не можете его увидеть, потому что не печатаете трассировку стека.

UPDATE:

Я ожидаю, что «xyz-headshots» - это имя файла. Если это так, добавьте расширение файла и удалите завершающий символ "/". Так, если это, например, текстовый файл, он должен выглядеть следующим образом static/images/xyz-headshots.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...