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

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
  • 相关代码:
    1. OrderBean类
    public class OrderBean {
        // ...其他属性
        private LocalDateTime orderDate;
        
        public LocalDateTime getOrderDate() {
            return orderDate;
        }
        
        public void setOrderDate(LocalDateTime orderDate) {
            this.orderDate = orderDate;
        }
    }
    
    1. 存入HttpSession的代码
    public String checkout(HttpSession session){
        // ...其他逻辑
        OrderBean orderBean = new OrderBean();
        LocalDateTime localDateTime = LocalDateTime.now();
        orderBean.setOrderDate(localDateTime);
        session.setAttribute("orderBean",orderBean);
        // ...其他逻辑
        return "cart/cart";
    }
    
    1. 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,需手动配置模板引擎时添加该方言:

  1. 确保Maven依赖版本与Thymeleaf核心版本匹配:
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-java8time</artifactId>
    <version>3.1.2.RELEASE</version> <!-- 版本需和thymeleaf核心版本一致 -->
</dependency>
  1. 在初始化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);
  1. 验证模板表达式:
    完成配置后,模板中的#temporals.format即可正常处理LocalDateTime对象,完成格式化。

内容的提问来源于stack exchange,提问作者JavaWeb Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:15:38