一尘不染

Spring Boot:Thymeleaf打包后无法分解碎片

spring-boot

即时通讯使用这样的片段:

@RequestMapping(value="/fragment/nodeListWithStatus", method= RequestMethod.GET)
public String nodeListWithStatus(Model model) {

    // status der nodes
    model.addAttribute("nodeList", nodeService.getNodeListWithOnlineStatus());

    return "/fragments :: nodeList";
}

模板位于/ src / main / resources /
templates中。从IntelliJ启动应用程序时,这工作正常。一旦我创建一个.jar并启动它,上面的代码将不再起作用。错误:

[2014-10-21 20:37:09.191] log4j - 7941 ERROR [http-nio-666-exec-2] --- TemplateEngine: [THYMELEAF][http-nio-666-exec-2] Exception processing template "/fragments": Error resolving template "/fragments", template might not exist or might not be accessible by any of the configured Template Resolvers

当我用Winrar打开.jar时,我看到了/templates/fragments.html-似乎在那里。

我的pom.xml具有用于构建jar的这一部分(Maven清理,安装):

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>de.filth.Application</mainClass>
                <layout>JAR</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

谁能告诉我我在这里做错了什么?

谢谢!


阅读 439

收藏
2020-05-30

共1个答案

一尘不染

您不需要/视图名称的前导,即应返回fragments :: nodeList而不是/fragments :: nodeList。进行此更改后,从您的IDE或jar文件运行时,Thymeleaf应该能够找到模板。

如果您有兴趣,请在下面进行以下操作:

视图名称用于在类路径上搜索资源。fragments :: nodeList表示资源名称为/templates/fragments.html/fragments :: nodeList表示资源名称为/templates//fragments.html(请注意双斜杠)。当您在IDE中运行时,该资源可直接用于文件系统,并且双斜杠不会造成问题。从jar文件运行时,资源嵌套在该jar中,并且双斜杠阻止找到它。我不完全理解为什么行为上会有这种差异,这很不幸。我打开了一个问题,以便我们(Spring Boot团队)可以查看是否有什么可以做的来使行为保持一致。

2020-05-30