我有一个thymelaf(3.0.11.REASE(文本模板,迭代如下:
[# th:each="sei : ${specificInfoElements}"]
[(${sei?.elementLabel})] : [(${sei?.elementValues})]
[/]
模板引擎没有评估以上内容,其输出如下:
[# th:each="sei : ${specificInfoElements}"]
:
[/]
有人能帮我理解我做错了什么吗?
注意:我使用的是弹簧靴。
@Autowired
private SpringTemplateEngine thymeleafTemplateEngine;
Context thymeleafContext = new Context();
thymeleafContext.setVariables(templateModel);
String outputText = thymeleafTemplateEngine.process(emailTemplateString,
thymeleafContext);
我刚刚用Spring Boot测试了它,它运行良好。我到底做了什么:
- 使用Java 11的spring Boot 2.5.1通过start.spring.io创建一个新项目
- 使用以下内容更新
application.properties
:
spring.thymeleaf.mode=TEXT
spring.thymeleaf.suffix=.txt
- 创建包含模板的文件
src/main/resources/templates/test.txt
:
[# th:each="sei : ${specificInfoElements}"]
[(${sei?.elementLabel})] : [(${sei?.elementValues})]
[/]
- 创建一个从
CommandLineRunner
扩展的测试类,这样我就可以启动应用程序并看到一些输出:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import java.util.List;
@Component
public class Test implements CommandLineRunner {
@Autowired
private SpringTemplateEngine templateEngine;
@Override
public void run(String... args) throws Exception {
Context context = new Context();
context.setVariable("specificInfoElements", List.of(new SpecificInfoElement("first label", "first value"),
new SpecificInfoElement("second label", "second element")));
String result = templateEngine.process("test", context);
System.out.println("result = " + result);
}
private static class SpecificInfoElement {
private String elementLabel;
private String elementValues;
public SpecificInfoElement(String elementLabel, String elementValues) {
this.elementLabel = elementLabel;
this.elementValues = elementValues;
}
public String getElementLabel() {
return elementLabel;
}
public String getElementValues() {
return elementValues;
}
}
}
运行此输出:
2021-06-22 08:22:39.229 INFO 13464 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 1.119 seconds (JVM running for 2.828)
result =
first label : first value
second label : second element
我希望这能帮助你弄清楚你在做什么。
由于我将模板存储在DB中,默认情况下thymeleaf
使用StringTemplateResolver
。首次调用process
方法时,StringTemplateResolver
被添加到SpringTemplateEngine
中,如从org.thymeleaf.TemplateEngine
:获取的代码片段所示
if (this.templateResolvers.isEmpty()) {
this.templateResolvers.add(new StringTemplateResolver());
}
在调用process
方法之前,我更改了StringTemplateResolver
的模板模式,如下所示:
if (CollectionUtils.isEmpty(springTemplateEngine.getTemplateResolvers())) {
// calling process method will initialize SpringTemplateEngine with StringTemplateResolver.
springTemplateEngine.process("template contents", context);
Set<ITemplateResolver> templateResolvers =
springTemplateEngine.getTemplateResolvers();
StringTemplateResolver stringTemplateResolver = (StringTemplateResolver) templateResolvers.iterator().next();
stringTemplateResolver.setTemplateMode(TemplateMode.TEXT);
}