【问题标题】:Configure multiple template resolvers for a single Spring Boot instance为单个 Spring Boot 实例配置多个模板解析器
【发布时间】:2018-06-01 13:09:45
【问题描述】:

我正在尝试配置第二个模板解析器以供 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/

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

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

【问题讨论】:

    标签: spring spring-boot thymeleaf


    【解决方案1】:

    如果你想添加多个解析器,你可以使用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;
        }
    
    }
    

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

    【讨论】:

    • 好的,我看到了我在配置类中犯的明显错误,我已经相应地对其进行了更改,但是我将如何在 YAML 文件中指定它来做同样的事情呢?
    • @Kerry 我只使用手动配置来配置多个模板解析器。所以我不知道 Spring Boot 这样做的方式。您可以查看 Spring Boot Source Code 以找到执行此操作的方法(如果可能的话)。最好的检查方法是查看ThymeleafAutoConfiguration 文件
    猜你喜欢
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2018-07-10
    • 2014-05-11
    • 2016-01-30
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多