Thymeleaf中使用LocalDate类方法做多条件判断出现解析错误如何解决
问题原因与修复方案
核心错误点
- Thymeleaf的多条件拼接必须放在同一个
${}表达式内部,不能拆分多个${}用AND连接 #temporals.format是日期格式化方法,返回值是字符串,不能直接作为布尔判断条件,日期比较需要用#temporals提供的比较方法- 存在语法错误:
timesheet.date.plusDays(7}少了右括号,多条件的AND关键字不能写在${}外部 - 属性调用错误:你的Timesheet类中定义的日期属性是
date,不存在localDate属性,timesheet.localDate.now()属于无效调用 - 逻辑不匹配:你需要的是判断日期间隔,不是格式化日期,格式化是展示用的,不是条件判断用的
正确实现代码
<!-- 条件判断与日期展示分离,所有判断逻辑放在同一个${}内 --> <!-- MISSING状态:可根据你的业务调整日期条件,示例为id=0且当前时间早于记录日期 --> <span th:if="${timesheet.id == 0 and #temporals.createNow().isBefore(timesheet.date)}" class="missing">MISSING</span> <!-- DRAFT状态:id≠0且记录日期加7天前 --> <span th:if="${timesheet.id != 0 and #temporals.createNow().isBefore(timesheet.date.plusDays(7))}" class="draft">DRAFT</span> <!-- AVAILABLE状态:id≠0且记录日期加7天后、加10天前 --> <span th:if="${timesheet.id != 0 and #temporals.createNow().isAfter(timesheet.date.plusDays(7)) and #temporals.createNow().isBefore(timesheet.date.plusDays(10))}" class="available">AVAILABLE</span> <!-- OVERDUE状态:id≠0且记录日期距今超过10天 --> <span th:if="${timesheet.id != 0 and #temporals.createNow().isAfter(timesheet.date.plusDays(10))}" class="overdue">OVERDUE</span> <!-- 单独展示格式化后的日期 --> <span>记录日期:<span th:text="${#temporals.format(timesheet.date, 'dd-MM-yyyy')}"></span></span>
补充说明
- 如果你的SpringBoot版本较旧,
#temporals.createNow()无法使用,可以改用T(java.time.LocalDate).now()获取当前日期 - 如果业务逻辑中id=0的场景也需要判断日期状态,直接调整对应
th:if中的id判断条件即可 - 所有逻辑判断都放在同一个
${}内部,多条件用and或者or连接,不需要额外加引号
内容的提问来源于stack exchange,提问作者MindGames2015
相关产品推荐
相关产品推荐

