Spring Boot:Thymeleaf在包装后没有解析碎片

时间:2014-10-21 18:36:37

标签: spring fragment spring-boot thymeleaf

我正在使用这样的片段:

@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 clean,install):

<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>

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

如果您有兴趣,可以了解一下发生的事情:

视图名称用于在类路径上搜索资源。 fragments :: nodeList表示资源名称为/templates/fragments.html/fragments :: nodeList表示资源名称为/templates//fragments.html(请注意双斜杠)。当您在IDE中运行时,资源可以直接从文件系统中获得,双斜杠不会导致问题。当您从jar文件运行时,资源嵌套在该jar中,并且双斜杠阻止它被发现。我不完全理解为什么会出现这种不同的行为,这是相当不幸的。我opened an issue所以我们(Spring Boot团队)可以看看我们能做些什么来使行为保持一致。

答案 1 :(得分:1)

这是一个古老的话题,但我在遇到类似症状和不同根本原因的问题时偶然发现了它。想要分享解决方案,帮助我,以防它可以帮助别人......

显然,messages.properties文件的名称区分大小写,但不是到处都是。我有我的名为&#34; Messages.properties&#34; (使用大写M)并且它在IDE(IntelliJ)中工作得很好,但是一旦我尝试从jar运行app,所有消息都被?? parameter.name ??替换。用小写m替换M解决了这个问题。