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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:21:35