Thymeleaf字符串模板无法渲染变量,寻求解决办法
Thymeleaf字符串模板变量未替换问题解决
问题现象
使用Thymeleaf的StringTemplateResolver并设置TemplateMode.TEXT模式处理字符串模板时,模板中的${greetings}等变量未被替换,输出结果仍为原始模板内容。
问题代码
import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import org.thymeleaf.templateresolver.StringTemplateResolver; import org.thymeleaf.templatemode.TemplateMode; import java.util.HashMap; import java.util.Map; public class EmailService { public static void main(String[] args) { // Define the template string String emailTemplateString = "Hello ${greetings},\n\nHere is your report: ${subject}.\n\nBest regards,\n${team}\n\n(Email Subject: ${name})"; // Create the context and set variables Context context = new Context(); Map<String, Object> variables = new HashMap<>(); variables.put("greetings", "Dear Frodo"); variables.put("subject", "Sub Custody Report"); variables.put("team", "Ring of the fellowship"); variables.put("name", "Aragorn"); context.setVariables(variables); // Set up the template engine TemplateEngine textTemplateEngine = new TemplateEngine(); StringTemplateResolver stringTemplateResolver = new StringTemplateResolver(); stringTemplateResolver.setTemplateMode(TemplateMode.TEXT); stringTemplateResolver.setCacheable(false); textTemplateEngine.setTemplateResolver(stringTemplateResolver); // Process the template String processedTemplate = textTemplateEngine.process(emailTemplateString, context); // Print the result System.out.println(processedTemplate); } }
问题原因
Thymeleaf的TEXT模板模式下,默认变量表达式语法为[[${变量名}]],直接使用${变量名}会被当作普通文本处理,不会触发变量替换。
解决方法
有两种可行方案:
方案一:修改模板语法
将模板中的${变量名}替换为TEXT模式默认识别的[[${变量名}]]:
// 修改后的模板字符串 String emailTemplateString = "Hello [[${greetings}]],\n\nHere is your report: [[${subject}]].\n\nBest regards,\n[[${team}]]\n\n(Email Subject: [[${name}]])";
方案二:自定义表达式前缀后缀
如果不想修改模板内容,可以通过StringTemplateResolver配置自定义表达式的前缀和后缀,让解析器直接识别${}:
// 配置解析器时添加以下两行 stringTemplateResolver.setExpressionPrefix("${"); stringTemplateResolver.setExpressionSuffix("}");
修正后完整代码(方案一示例)
import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import org.thymeleaf.templateresolver.StringTemplateResolver; import org.thymeleaf.templatemode.TemplateMode; import java.util.HashMap; import java.util.Map; public class EmailService { public static void main(String[] args) { String emailTemplateString = "Hello [[${greetings}]],\n\nHere is your report: [[${subject}]].\n\nBest regards,\n[[${team}]]\n\n(Email Subject: [[${name}]])"; Context context = new Context(); Map<String, Object> variables = new HashMap<>(); variables.put("greetings", "Dear Frodo"); variables.put("subject", "Sub Custody Report"); variables.put("team", "Ring of the fellowship"); variables.put("name", "Aragorn"); context.setVariables(variables); TemplateEngine textTemplateEngine = new TemplateEngine(); StringTemplateResolver stringTemplateResolver = new StringTemplateResolver(); stringTemplateResolver.setTemplateMode(TemplateMode.TEXT); stringTemplateResolver.setCacheable(false); textTemplateEngine.setTemplateResolver(stringTemplateResolver); String processedTemplate = textTemplateEngine.process(emailTemplateString, context); System.out.println(processedTemplate); } }
运行结果
执行后将输出替换完成的文本:
Hello Dear Frodo, Here is your report: Sub Custody Report. Best regards, Ring of the fellowship (Email Subject: Aragorn)
内容的提问来源于stack exchange,提问作者Elsasin
相关产品推荐
相关产品推荐

