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

时间:2018-06-01 13:09:46

标签: spring spring-boot thymeleaf

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

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

thymeleaf:
    mode: LEGACYHTML5
    cache: false

作为第一步,我尝试添加配置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;
    }

}

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

我进一步尝试使用以下内容来扩展YAML文件:

thymeleaf:
    -
      mode: LEGACYHTML5
      cache: false
      prefix: classpath:/public/
    -
      mode: LEGACYHTML5
      cache: false
      prefix: classpath:/templates/

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

任何人都知道怎么做或者能看出我做错了什么?

1 个答案:

答案 0 :(得分:2)

如果您想添加多个解析器,可以使用engine.addTemplateResolver代替engine.setTemplateResolver(),或使用setTemplateResolvers()来获取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;
    }

}

P.S。另一方面,如果您想使用Spring启动的自动配置功能,则应该避免手动设置配置(就像在配置类中那样),而只是在YAML中定义Spring Boot将使用的属性,并将配置您的模板引擎/解析器。如果手动指定配置弹簧启动,则不会另外配置Thymeleaf引擎/解析器,因此不会使用YAML属性w.r.t您定义的配置,即基本上覆盖弹簧靴配置。