Thymelaf[#th:each]未被解析



我有一个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测试了它,它运行良好。我到底做了什么:

  1. 使用Java 11的spring Boot 2.5.1通过start.spring.io创建一个新项目
  2. 使用以下内容更新application.properties
spring.thymeleaf.mode=TEXT
spring.thymeleaf.suffix=.txt
  1. 创建包含模板的文件src/main/resources/templates/test.txt
[# th:each="sei : ${specificInfoElements}"]
[(${sei?.elementLabel})] : [(${sei?.elementValues})]
[/]
  1. 创建一个从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);
}

最新更新