Spring Boot 2.1中的热重装Thymeleaf模板和资源包

时间:2019-02-23 18:57:06

标签: java spring spring-boot thymeleaf

我创建了一个启用了i18n的Spring Boot 2.1.3应用程序,添加了devtools,并安装了Firefox LiveReload扩展。不幸的是,当我更改Thymeleaf模板或i18n消息时,它没有改变。 Spring Boot documentation似乎建议您要做的就是安装devtools,它将禁用静态资源的缓存。

这是我创建应用程序所要做的:

mkdir bootiful-i18n
cd bootiful-i18n
http https://start.spring.io/starter.zip dependencies==web,thymeleaf -d | tar xvz

然后我创建了一个HomeController.java

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

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

我在src/main/resources/templates/home.html创建了Thymeleaf模板:

<html xmlns:th="http://www.thymeleaf.org">
<body>
   <h1 th:text="#{title}"></h1>
   <p th:text="#{message}"></p>
</body>
</html>

我在messages.properties中添加了一个src/main/resources文件:

title=Welcome
message=Hello! I hope you're having a great day.

这一切都很好。为了启用热重载,我在pom.xml中添加了devtools:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

并安装了LiveReload extension for Firefox

我重新启动服务器,启用LiveReload并导航到http://localhost:8080。我尝试更改并保存home.htmlmessages.properties并刷新浏览器。浏览器中的输出不会更改。在Spring Boot 2.1中,我还需要做些其他事情来禁用Thymeleaf模板和消息包的缓存吗?

2 个答案:

答案 0 :(得分:2)

Devtools将禁用缓存,以便在需要再次呈现模板文件时可以重新考虑对模板文件的更新。

但是,当您的应用程序在JVM进程中启动时,没有任何指向您的源文件的信息,它只能看到类路径。因此,对源文件所做的任何更改都需要更新到类路径位置,这通常是通过要求IDE“构建项目”来实现的。

因此模板所缺少的步骤是,如果文档尚不清楚,请随意提出一个建议,因为我们对此进行了很多迭代。

尽管没有关于i18n的具体信息。如果您更改它们并更新类路径,我们将重新启动应用程序,而不是像对模板一样进行重新选择。我们确实曾经尝试对此提供支持,请参见this issue for more details。话虽如此,您不应指望对资源文件的更改将“起作用”。更改配置显然会要求应用程序重启(例如,再次使用devtools时更新类路径)。

一些有关IDE支持的注释:

  • Eclipse逐步编译并复制“保存”中的更改文件。因此,如果您保存模板,应该会很好
  • 截至2018.1,IntelliJ IDEA Ultimate具有dedicated devtools support-如果将“停用框架”配置为“更新资源”,则在切换到浏览器时将做正确的事情。在获得该支持之前,我有一个特殊的按键映射到“构建项目”(递增地编译和复制资源),每当我希望反映更改时便会调用

如果不使用IDE,则需要一些东西来为您更新类路径。我们尝试开箱即用地支持它,但事实证明它相当复杂。有a comment to help you if you're using Gradle

答案 1 :(得分:0)

将以下内容添加到您的package davidpadillaservice import grails.testing.services.ServiceUnitTest import spock.lang.Specification class SomeResourceServiceSpec extends Specification implements ServiceUnitTest<SomeResourceService>{ void "test interacting with the service"() { expect: service.firstLine == 'line number one' service.secondLine == 'line number two' } } 中:

application.properties