Spring Boot+Thymeleaf按日期分组展示交易数据日期不显示问题
问题排查与解决
核心问题:Thymeleaf模板语法错误
你的Thymeleaf模板中,日期字段的表达式存在多余空格,导致Thymeleaf无法正确解析date属性:
<!-- 错误写法:singleGroup 和 .date 之间有空格 --> <h1 th:text="${singleGroup .date}"></h1>
空格会让Thymeleaf把singleGroup和.date当成两个独立的表达式部分,无法正确读取TransactionGroup的date属性。
修复步骤
1. 修正Thymeleaf模板的表达式
把日期行的空格去掉,同时建议移除交易字段表达式中的多余空格,避免类似问题:
<div th:each="singleGroup : ${transactionGroup}"> <!-- 正确写法:移除singleGroup和.date之间的空格 --> <h1 th:text="${singleGroup.date}"></h1> <div th:each="singleTrans : ${singleGroup.transactions}"> <h2>Amount: <span th:text="${singleTrans.amount}"></span></h2><br> <h2>Note: <span th:text="${singleTrans.note}"></span></h2><br> <h2>Wallet name: <span th:text="${singleTrans.walletName}"></span></h2><br> <h2>Expense Category: <span th:text="${singleTrans.expenseCategories}"></span></h2><br> <h2>IncomeCategory: <span th:text="${singleTrans.incomeCategories}"></span></h2> </div> </div>
2. (可选)自定义日期显示格式
如果需要将日期转为更友好的格式(比如2023年01月01日),可以用Thymeleaf的#temporals工具类处理LocalDate:
<h1 th:text="${#temporals.format(singleGroup.date, 'yyyy年MM月dd日')}"></h1>
若使用
java.util.Date则用#dates工具类,语法类似。
3. 验证TransactionGroup的Getter方法
确保TransactionGroup的date字段有标准的Getter方法,Thymeleaf依赖此方法读取属性:
public class TransactionGroup { private LocalDate date; private List<Transaction> transactions; // 必须存在此Getter public LocalDate getDate() { return date; } public void setDate(LocalDate date) { this.date = date; } // transactions的Getter/Setter同理 public List<Transaction> getTransactions() { return transactions; } public void setTransactions(List<Transaction> transactions) { this.transactions = transactions; } }
额外优化:简化控制器分组逻辑
你当前的分组循环可以用Java Stream API简化,代码更简洁且不易出错:
@GetMapping("/userTransactions/{user_id}") public String getUserTransactions(@PathVariable("user_id") long user_id, Model model) { List<Transaction> transactions = transactionRepository.getTransactionsByUserId(user_id); // 按日期分组并转换为TransactionGroup列表 List<TransactionGroup> transactionByDate = transactions.stream() .collect(Collectors.groupingBy(Transaction::getDate)) .entrySet().stream() .map(entry -> { TransactionGroup group = new TransactionGroup(); group.setDate(entry.getKey()); group.setTransactions(entry.getValue()); return group; }) .collect(Collectors.toList()); model.addAttribute("transactionGroup", transactionByDate); return "transactions"; }
调试验证
如果修复后仍有问题,可在模板中临时添加调试代码,确认singleGroup的结构:
<!-- 临时输出整个对象,查看date是否存在 --> <div th:text="${singleGroup}"></div>
内容的提问来源于stack exchange,提问作者Frosty Nah
相关产品推荐
相关产品推荐

