我有简单的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)。
我能做些什么才能让它正常工作?
答案 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
标记内提供了两次)。
这可以解决您的问题。