Thymeleaf 2.5.6使用变量表达式提示cannot Resolve variable name原因是什么
问题原因分析
- 注解使用错误
你当前使用的是@RestController注解,该注解是@Controller与@ResponseBody的组合注解,默认所有方法的返回值会直接作为响应体输出,不会触发Thymeleaf的视图解析流程,需要替换为@Controller注解才能正常渲染模板。 - 方法缺少请求映射
你的process处理方法没有添加@GetMapping/@RequestMapping等请求映射注解,Spring无法将请求路由到该方法执行,today变量从未被写入Thymeleaf上下文,模板渲染时自然找不到对应变量。 - 日期格式化配置错误(额外问题)
你使用的dd-mm-yyyy格式化串中小写mm代表分钟,大写MM才代表月份,会导致输出的日期不符合预期。 - 若仅IDE静态提示报错、运行正常
属于IDE的Thymeleaf静态检测局限性,在模板文件开头添加变量声明注释即可消除提示:<!--/*@thymesVar id="today" type="java.lang.String"*/-->
修正后的代码
package com.nilmani.thymeleafdemo.controller import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.GetMapping import org.thymeleaf.ITemplateEngine import org.thymeleaf.context.WebContext import java.text.SimpleDateFormat import java.util.* import javax.servlet.ServletContext import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @Controller class HomeController : IGTVGController() { @GetMapping("/home") @Throws(Exception::class) fun process(request:HttpServletRequest,response: HttpServletResponse, servletContext: ServletContext,templateEngine: ITemplateEngine){ val dateForm:SimpleDateFormat= SimpleDateFormat("dd-MM-yyyy") val calendar:Calendar = Calendar.getInstance() val ctx : WebContext = WebContext(request,response,servletContext,request.locale) ctx.setVariable("today",dateForm.format(calendar.time)) templateEngine.process("home",ctx,response.writer) } }
可选优化方案
Spring Boot项目中不需要手动调用模板引擎的process方法,更简洁的写法如下:
@Controller class HomeController { @GetMapping("/home") fun home(model: Model): String { val dateForm = SimpleDateFormat("dd-MM-yyyy") model.addAttribute("today", dateForm.format(Date())) return "home" } }
内容的提问来源于stack exchange,提问作者Mama
相关产品推荐
相关产品推荐

