首页 > 解决方案 > Thymeleaf 3.0 模板引擎,从两个位置获取模板

问题描述

我正在设置一个自定义模板引擎,它应该处理来自两个位置的模板。我如何设置一个可以实现这一目标的自定义模板引擎?

好的,引擎应该只处理百里香模板并从两个不同的位置获取它们。其中之一是通常的 /WEB-INF/templates ,但另一个应该在应用程序上下文之外并在文件系统中为了争论,让它在 D:/apps/myapp/instances/ 上。对于文件系统,我设法使用 FileTemplateResolver 处理模板,而对于内部模板 ClassLoaderTemplateResolver,这并不好,因为我读过 Thymeleaf 3.0 使用 SpringResourceTemplateResolver。除了这个问题之外,我还有另一个问题,我无法同时处理引擎进程,它可以根据顺序是一个或另一个。检查我的代码

        @Bean
    public TemplateEngine templateEngine() {
      SpringTemplateEngine templateEngine = new 
          SpringTemplateEngine();

      templateEngine.setEnableSpringELCompiler(true);
      templateEngine.addTemplateResolver(thymeleafTemplateResolver());
      templateEngine.addTemplateResolver(databaseTemplateResolver());

      return templateEngine;
    }

    //Resolver for thymeleaf
    @Bean
    public ThymeleafViewResolver  thymeleafViewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine((ISpringTemplateEngine) templateEngine());
        viewResolver.setCharacterEncoding("UTF-8");
        viewResolver.setOrder(0);
        viewResolver.setApplicationContext(applicationContext);

        return viewResolver;
    }
    //Pulling out methods
    @Bean(name = "databaseTemplateResolver")
    public ITemplateResolver databaseTemplateResolver() {
        var prefix = rootDirectory+Directory.INSTANCES_DIR+File.separator;
        System.out.println(prefix);
        var templateResolver 
          = new FileTemplateResolver();
        templateResolver.setPrefix(prefix);
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setOrder(1);
        templateResolver.setCacheable(false);
        return templateResolver;
    }
    @Bean(name = "thymeleafTemplateResolver")
    public ITemplateResolver thymeleafTemplateResolver() {
        var templateResolver 
          = new ClassLoaderTemplateResolver();
      templateResolver.setPrefix("templates/");

       // var templateResolver   = new SpringResourceTemplateResolver();
      //  templateResolver.setApplicationContext(applicationContext);
        //templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setCacheable(false);
        templateResolver.setOrder(0);
        return templateResolver;
    }

如果 ThymeleafTemplateResolver 的顺序设置为 0,databaseTemplateResolver 的顺序设置为 1,我将得到

        org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "templates/europe/fra-1/offer.html")
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:235) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]

尝试加载文件系统模板时,由于某种原因,内部模板将在没有 css 的情况下加载

如果 ThymeleafTemplateResolver 的顺序设置为 1,databaseTemplateResolver 的顺序设置为 0,我将得到

       org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "D:\apps\myapp\instances\login.html")
org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:235)
org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666)

尝试加载内部模板时,但文件系统模板会加载得很好。

由于某种原因,模板引擎只选择一个解析器而不检查另一个。我该如何解决这些问题并使模板引擎同时处理?

谢谢!

标签: javaspringspring-bootviewthymeleaf

解决方案


除非您设置setCheckExistence(true)了一个解析器(首先出现的解析器具有较低的订单号),否则它会在找不到模板时引发异常。 请参阅链接解析器的文档


推荐阅读