You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:16:13