为单个 Spring Boot 实例配置多个模板解析器

Ker*_*rry 3 spring thymeleaf spring-boot

我正在尝试配置 Thymeleaf 使用的第二个模板解析器。我还想要在文件夹下查找的默认解析器templates,但无论我尝试什么,最终都只会得到一个解析器。

在我的项目中已经有一个 yaml 配置文件,其中包含:

thymeleaf:
    mode: LEGACYHTML5
    cache: false
Run Code Online (Sandbox Code Playgroud)

作为第一步,我尝试添加一个配置 bean:

@Configuration
@EnableWebMvc
public class ThymeleafConfiguration extends WebMvcConfigurerAdapter implements ApplicationContextAware
{

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException
    {
        this.applicationContext = applicationContext;
    }

    @Bean
    public TemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        return engine;
    }

    private ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/public/");
        resolver.setTemplateMode("HTML");
        return resolver;
    }

}
Run Code Online (Sandbox Code Playgroud)

但我从未在 中看到第二个解析器org.thymeleaf.TemplateRepository,只是默认的。

我进一步尝试使用以下内容修改 YAML 文件:

thymeleaf:
    -
      mode: LEGACYHTML5
      cache: false
      prefix: classpath:/public/
    -
      mode: LEGACYHTML5
      cache: false
      prefix: classpath:/templates/
Run Code Online (Sandbox Code Playgroud)

但我再次只创建了一个解析器。

任何人都知道如何做到这一点或者可以看到我做错了什么?

小智 6

如果您想添加多个解析器,您可以使用engine.addTemplateResolver代替engine.setTemplateResolver()或使用setTemplateResolvers()which 接受Set.

@Configuration
@EnableWebMvc
public class ThymeleafConfiguration extends WebMvcConfigurerAdapter implements ApplicationContextAware
{

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException
    {
        this.applicationContext = applicationContext;
    }

    @Bean
    public TemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.addTemplateResolver(templateResolverPublic());
        engine.addTemplateResolver(templateResolverTemplates());
        return engine;
    }

    private ITemplateResolver templateResolverPublic() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/public/");
        resolver.setTemplateMode("HTML");
        return resolver;
    }

    private ITemplateResolver templateResolverTemplates() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/templates/");
        resolver.setTemplateMode("HTML");
        return resolver;
    }

}
Run Code Online (Sandbox Code Playgroud)

PS 另一方面,如果您想使用 Spring boot 的自动配置功能,您应该避免手动设置配置(就像您在配置类中所做的那样),而只需在 YAML 中定义 Spring Boot 将使用并配置的属性您的模板引擎/解析器。如果您手动指定配置,Spring Boot 将不会额外配置 Thymeleaf 引擎/解析器,因此您定义的配置的 YAML 属性将不会被使用,即您基本上覆盖了 Spring Boot 配置。