Thymeleaf中LocalDateTime类型格式化失效问题求助
问题描述
- 环境:MySQL 8.0+,mysql-connector-java 8.0.12,JDBC驱动
com.mysql.cj.jdbc.Driver,纯javax.servlet-api环境,Thymeleaf - 现象:
- JavaBean的
orderDate属性为java.sql.Timestamp时,用#dates.format格式化正常 - 改为
java.time.LocalDateTime后,使用#temporals.format抛出TemplateProcessingException
- JavaBean的
- 相关代码:
- OrderBean类
public class OrderBean { // ...其他属性 private LocalDateTime orderDate; public LocalDateTime getOrderDate() { return orderDate; } public void setOrderDate(LocalDateTime orderDate) { this.orderDate = orderDate; } }- 存入HttpSession的代码
public String checkout(HttpSession session){ // ...其他逻辑 OrderBean orderBean = new OrderBean(); LocalDateTime localDateTime = LocalDateTime.now(); orderBean.setOrderDate(localDateTime); session.setAttribute("orderBean",orderBean); // ...其他逻辑 return "cart/cart"; }- Thymeleaf模板代码
<td th:text="${#temporals.format(orderBean.getOrderDate(),'yyyy-MM-dd HH:mm:ss')}"></td> - 错误栈:
org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating OGNL expression: "#temporals.format(orderBean.getOrderDate(),'yyyy-MM-dd HH:mm:ss')" (template: "order/order" - line 48, col 19) at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:191) at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:95) at org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166) at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109) at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138) at org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor.doProcess(AbstractStandardExpressionAttributeTagProcessor.java:144) at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314) at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) at org.thymeleaf.engine.Model.process(Model.java:282) at org.thymeleaf.engine.Model.process(Model.java:290) at org.thymeleaf.engine.IteratedGatheringModelProcessable.processIterationModel(IteratedGatheringModelProcessable.java:367) at org.thymeleaf.engine.IteratedGatheringModelProcessable.process(IteratedGatheringModelProcessable.java:221) at org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640) at org.thymeleaf.engine.CloseElementTag.beHandled(CloseElementTag.java:139) at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:136)
- 已尝试:引入
thymeleaf-extras-java8time依赖,但问题依旧
解决方案
纯Servlet环境下Thymeleaf不会自动注册Java8TimeDialect,需手动配置模板引擎时添加该方言:
- 确保Maven依赖版本与Thymeleaf核心版本匹配:
<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-java8time</artifactId> <version>3.1.2.RELEASE</version> <!-- 版本需和thymeleaf核心版本一致 --> </dependency>
- 在初始化Thymeleaf模板引擎的代码中添加方言:
import org.thymeleaf.TemplateEngine; import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ServletContextTemplateResolver; // 示例:在ServletContextListener或初始化Servlet中配置 ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(getServletContext()); templateResolver.setTemplateMode(TemplateMode.HTML); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); TemplateEngine templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver); // 关键步骤:注册Java8TimeDialect templateEngine.addDialect(new Java8TimeDialect()); // 将模板引擎存入ServletContext供全局使用 getServletContext().setAttribute("templateEngine", templateEngine);
- 验证模板表达式:
完成配置后,模板中的#temporals.format即可正常处理LocalDateTime对象,完成格式化。
内容的提问来源于stack exchange,提问作者JavaWeb Noob
相关产品推荐
相关产品推荐

