一尘不染

Spring Boot和Thymeleaf-再次热插拔模板和资源

spring-boot

我尝试了在本文和文档中找到的所有技巧和窍门,但还是没有运气。我有Thymeleaf的Spring
webapp。当我在IDEA中调用update时,不会重新加载资源和模板(它什么也没说要重新加载)。然后,我可以在疯狂的浏览器中按ctrl +
f5,只是不存在更改。

一切都在一个Java类中进行配置,如下所示:

@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {

我的文件夹结构现在看起来像
这样,但我也尝试将资源放置在没有“静态”文件夹或webapp /
resources的位置。

ResourceHandlerRegistry:

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    super.addResourceHandlers(registry);
    registry.addResourceHandler("/img/**").addResourceLocations("classpath:/static/img/");
    registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
    registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
}

我在两个application.properties中都指定了cache = false:

spring.thymeleaf.cache=false

并在提到的MvcConfig类中:

@Bean
public SpringResourceTemplateResolver templateResolver() {
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setApplicationContext(this.applicationContext);
    templateResolver.setPrefix("/WEB-INF/templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode(TemplateMode.HTML);
    templateResolver.setCacheable(false);
    return templateResolver;
}

根据关于SO的一些答案,我为devtools添加了依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>1.4.1.RELEASE</version>
    <optional>true</optional>
</dependency>

还是行不通。有人说用addResources = true添加maven启动插件,所以我这样做了:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.4.1.RELEASE</version>
    <configuration>
        <addResources>true</addResources>
    </configuration>
</plugin>

我猜我的想法设置正确,因为当我调用update时,我的Java类会立即重新加载。只有资源和HTML文件不是,我必须为此重新启动服务器。实际上*
.html文件没什么大不了的,但是在每一次小的css和js更改后重新启动服务器都会使我的工作减慢很多,而且由于我花了将近15个小时来弄清楚问题出在哪里,这真令人沮丧。

任何帮助将不胜感激。


阅读 318

收藏
2020-05-30

共1个答案

一尘不染

我花了一些时间,最后在这里我将解释如何使它工作。到处搜寻您可能会发现一些资讯:

我的初始方法是禁用缓存并添加Spring开发工具:

spring靴 application.properties

spring.thymeleaf.cache=false
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.prefix=/templates/

pom.xml

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

但是,仅使用上面的代码片段是不够的,因为仅在创建项目时才执行热交换(Intellij Idea中的CTRL + F9)。这是因为
默认模板解析器基于类路径 ,这就是需要重新编译的原因。


一个有效的解决方案defaultTemplateResolver使用基于文件系统的解析器来覆盖:

application.properties

spring.thymeleaf.cache=false
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.templates_root=src/main/resources/templates/

应用类别

@SpringBootApplication
public class MyApplication {

    @Autowired
    private ThymeleafProperties properties;

    @Value("${spring.thymeleaf.templates_root:}")
    private String templatesRoot;

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

    @Bean
    public ITemplateResolver defaultTemplateResolver() {
        FileTemplateResolver resolver = new FileTemplateResolver();
        resolver.setSuffix(properties.getSuffix());
        resolver.setPrefix(templatesRoot);
        resolver.setTemplateMode(properties.getMode());
        resolver.setCacheable(properties.isCache());
        return resolver;
    }
}

我发现此解决方案是最佳的,因为它可以让您外部化配置并使用不同的配置文件(dev,prod等),同时可以通过 按F5键 来重新加载更改 :)

2020-05-30