替换片段

时间:2017-10-13 09:52:07

标签: java spring spring-mvc spring-boot thymeleaf

我有简单的SpringBoot应用程序。一切正常,但是当我尝试获取 index.html 时,我替换了片段,如下所示,我得到一个例外:

  

org.thymeleaf.exceptions.TemplateInputException:解析模板时出错"〜{layout",模板可能不存在或任何已配置的模板解析器可能无法访问(索引:2)

这是我的代码:

SPRING INITIALIZR 生成的build.gradle:

buildscript {
        ext {
            springBootVersion = '1.5.7.RELEASE'
        }
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.bearcave'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-web")

    runtime('org.postgresql:postgresql')
    compileOnly('org.projectlombok:lombok')
}

主:

@SpringBootApplication
public class MessengerApplication {

    public static void main(String[] args) {
        SpringApplication.run(MessengerApplication.class, args);
    }
}

控制器:

@Controller
public class HelloWorldController {

    @GetMapping("/")
    public String home() {
        return "index";
    }
}

指数:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:replace="~{layout :: layout (~{::body})}">
<body>
    <div><p>Hello world!</p></div>
</body>
</html>

布局:

<!doctype html>
<html th:fragment="layout (template)" xmlns:th="http://www.w3.org/1999/xhtml" xmlns:th="http://www.w3.org/1999/xhtml">

<head>
    <title>Messenger</title>
</head>

<body>
    <div th:replace="${template}"></div>
</body>
</html>

据我所知,Spring Boot自动配置,.html页面的默认路径是资源/模板,所以我有。此外,当我不尝试替换片段时没有问题(我收到简单的页面&#34; Hello world!&#34; text)。

我能做些什么才能让它正常工作?

1 个答案:

答案 0 :(得分:1)

默认情况下,spring-boot-starter-thymeleaf使用Thymeleaf 2.1 。在模板中,您使用的是Thymeleaf 3.0 中引入的片段表达式(~{})。这就是为什么你的表达式没有按预期解析并导致错误。

您必须将Thymeleaf的依赖项升级到更新版本。 Documentation说明如何在Maven管理的项目中执行此操作。我不熟悉Gradle,但我认为这将是模拟的。根据{{​​3}},您所要做的就是在 build.gradle 文件中提供以下行:

ext["thymeleaf.version"] = "3.0.2.RELEASE"
ext["thymeleaf-layout-dialect.version"] = "2.1.1"

之后,请从布局文件中删除重复的xmlns:th属性(您已在html标记内提供了两次)。

这可以解决您的问题。