java - 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)
尝试加载内部模板时,但文件系统模板会加载得很好。
由于某种原因,模板引擎只选择一个解析器而不检查另一个。我该如何解决这些问题并使模板引擎同时处理?
谢谢!
解决方案
除非您设置setCheckExistence(true)
了一个解析器(首先出现的解析器具有较低的订单号),否则它会在找不到模板时引发异常。 请参阅链接解析器的文档。
推荐阅读
- sql - SQL DB2 - 使用来自另一个表或查询的结果执行查询
- eclipse-cdt - 使用 Eclipse CDT 收集有关 `auto` 声明的信息
- python - cv2/imagick 处理混合 8 位和 24 位图像
- java - 如何将以前的运行上下文值存储在 talend 中并进行比较?
- go - “错误声明但未使用”有多个错误
- python - Tkinter - 如何在不破坏框架本身的情况下销毁框架中的每个小部件?
- r - 按组组织和获取 DF 中的平均值。R
- docusignapi - 在 DocuSign 中收听新评论
- python - 如何使用 Scrapy FormRequest 提交搜索
- vba - 有没有办法将报表中的文本框绑定到表单中的复选框?