在 spring-boot 中使用一个模板引擎渲染多个后缀
Posted
技术标签:
【中文标题】在 spring-boot 中使用一个模板引擎渲染多个后缀【英文标题】:render multiple suffixes with one template engine in spring-boot 【发布时间】:2017-09-30 17:53:28 【问题描述】:我创建了两个 thymleaf 解析器并将它们添加到模板引擎中,因此我可以在 spring-boot 中处理 txt/svg 模板。
@Configuration
public class TemplateEngineConfig
@Bean
public SpringTemplateEngine textTemplateEngine()
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.addTemplateResolver(textTemplateResolver());
templateEngine.addTemplateResolver(svgTemplateResolver());
return templateEngine;
private ITemplateResolver textTemplateResolver()
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setOrder(1);
templateResolver.setPrefix("templates/");
templateResolver.setSuffix(".txt");
templateResolver.setTemplateMode(TemplateMode.TEXT);
templateResolver.setCacheable(false);
return templateResolver;
private ITemplateResolver svgTemplateResolver()
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setOrder(2);
templateResolver.setPrefix("templates/");
templateResolver.setSuffix(".svg");
templateResolver.setTemplateMode(TemplateMode.TEXT);
templateResolver.setCacheable(false);
return templateResolver;
我就是这样用的。
@Component
public class TemplateRenderer
@Autowired
@Qualifier("textTemplateEngine")
private TemplateEngine textTemplateEngine;
public String renderPlainText(String filename, Map<String, Object> params)
Context context = new Context(LocaleContextHolder.getLocale(), params);
return textTemplateEngine.process(filename, context);
没有用。我尝试渲染templates/img.svg
,但Thymleaf 抱怨找不到templates/img.txt
文件,我该如何让它工作?
【问题讨论】:
【参考方案1】:我认为你应该用 @bean 和 Qualifier 标记 ITemplateResolver 所以当 您将 @autowire textTemplateEngine 或 svgTemplateEngine 所以 spring 将使用限定符名称自动装配它们。
@Bean
@Qualifier("textTemplateEngine")
private ITemplateResolver textTemplateResolver()
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setOrder(1);
templateResolver.setPrefix("templates/");
templateResolver.setSuffix(".txt");
templateResolver.setTemplateMode(TemplateMode.TEXT);
templateResolver.setCacheable(false);
return templateResolver;
@Bean
@Qualifier("svgTemplateEngine")
private ITemplateResolver svgTemplateResolver()
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setOrder(2);
templateResolver.setPrefix("templates/");
templateResolver.setSuffix(".svg");
templateResolver.setTemplateMode(TemplateMode.TEXT);
templateResolver.setCacheable(false);
return templateResolver;
您还可以通过 xml 配置配置 Thymeleaf 多个解析器,例如:
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
<property name="characterEncoding" value="UTF-8" />
<property name="templateEngine">
<bean class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="dialects">
<set>
<bean class="org.thymeleaf.spring4.dialect.SpringStandardDialect" />
</set>
</property>
<property name="templateResolvers">
<set>
<bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="cacheable" value="false" />
<property name="prefix" value="/fragments/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML5" />
</bean>
<bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="cacheable" value="false" />
<property name="prefix" value="/views/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML5" />
</bean>
</set>
</property>
</bean>
</property>
</bean>
【讨论】:
【参考方案2】:只需强制您的 SpringTemplateEngine 检查模板是否存在,而不仅仅是使用定义的模式。请强制添加
templateResolver.setCheckExistence(true);
到您的每个模板解析器。
【讨论】:
以上是关于在 spring-boot 中使用一个模板引擎渲染多个后缀的主要内容,如果未能解决你的问题,请参考以下文章