Thymeleaf处理XML模板时变量未被替换的问题求解
问题原因及解决方法
核心原因
Thymeleaf默认不会解析普通XML属性中的${}变量表达式,你需要显式标记需要动态渲染的内容,同时XML模板需要引入Thymeleaf命名空间才能识别th前缀的属性。
解决步骤
1. 补充XML模板命名空间
在模板的根标签上添加Thymeleaf命名空间声明:
<根标签名称 xmlns:th="http://www.thymeleaf.org"> <!-- 其余模板内容 --> </根标签名称>
2. 修改变量绑定写法(二选一即可)
方案A:使用Thymeleaf属性绑定(推荐)
把需要动态赋值的属性用th前缀标记,两种写法可选:
- 直接动态生成value属性:
<arc:set attr="CountryCode" th:value="${argument}"/>
- 保留静态测试值,渲染时动态覆盖原有value:
<arc:set attr="CountryCode" value="测试默认值" th:attr="value=${argument}"/>
方案B:使用内联表达式
如果你想继续用[[]]包裹变量的写法,需要在根标签开启XML内联模式:
<根标签名称 xmlns:th="http://www.thymeleaf.org" th:inline="xml"> <arc:set attr="CountryCode" value="[[${argument}]]"/> </根标签名称>
3. Java代码可选优化
测试阶段关闭模板缓存,避免读取历史缓存的旧模板导致修改不生效;如果是无Spring环境的独立项目,可以改用ClassLoaderTemplateResolver避免初始化空Spring上下文:
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); // 无Spring环境可替换为下面的代码 // ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver(); resolver.setApplicationContext(new AnnotationConfigApplicationContext()); resolver.setPrefix("templates/"); resolver.setSuffix(".xml"); resolver.setCharacterEncoding("UTF-8"); resolver.setTemplateMode(TemplateMode.XML); resolver.setCacheable(false); // 测试环境关闭模板缓存 SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(resolver); Context ctx = new Context(); ctx.setVariable("argument", "fr"); String xml = engine.process("Checker", ctx);
验证效果
修改完成后渲染得到的xml内容中,对应标签会输出为:
<arc:set attr="CountryCode" value="fr"/>
内容的提问来源于stack exchange,提问作者clmnt_sg
相关产品推荐
相关产品推荐

