如果springboot应用程序打包为jar,则Thymeleaf无法访问模型属性

时间:2019-03-13 13:43:03

标签: java spring spring-boot thymeleaf

我正在与thymeleaf建立一个springboot项目。从Eclipse中运行时,项目将按预期运行。即我可以访问百里香叶中的模型属性。

但是,当我将上述项目打包为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>

当应用程序作为springboot jar运行时,变量“ headshotsfileNameStrings”具有值“”,而从Eclipse运行时,变量“ headshotsfileNameStrings”具有值“ some_string_here_xyz”。

这可能是怎么回事?我没有看到任何错误,也不知道从哪里开始调试。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我的第一个检查是是否确实找到了文件,您可以放置​​一个调试点,看看您的资源值是否确实包含您期望的文件。

此外,添加catch子句并打印stacktrace而不是使用select t.*, max(DateOfData) over () as max_date from dbo.TMNCS; ,现在,如果此方法出现问题,它会默默地这样做。

此刻我相信会发生的事情是,您没有找到IOException文件,但是您看不到它,因为您没有打印stacktrace。

更新:

我希望“ xyz-headshots”是文件名。如果是这种情况,请添加文件扩展名并删除结尾的“ /”。因此,例如,如果它是文本文件,则其外观应为throws Exception

答案 1 :(得分:0)

此代码在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 resource not found when running as jar