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

SpringBoot中如何在Thymeleaf模板展示HashMap存储的项目分值键值对

错误排查与修复方案

问题1:控制器层参数传递错误

你调用model.addAttribute()时没有显式指定属性名,默认会以对象类名首字母小写作为属性名,你返回的实际是LinkedHashMap类型,默认属性名为linkedHashMap,和模板中引用的sortedMap不匹配,导致模板读取不到对应数据。

修正后控制器代码:

@GetMapping("/admin-dashboard")
private String getAdminDashboard(Model model){
    // 展示排名前10的项目逻辑
    HashMap<Project, Long> sortedMap = adminService.getSuccessfulSortedProjects();
    // 显式指定属性名为sortedMap,和模板保持一致
    model.addAttribute("sortedMap", sortedMap);
    return "admin-dashboard";
}

// 服务层代码逻辑无错误,可以保留原有实现
public HashMap<Project, Long> getSuccessfulSortedProjects() {
    List<Project> projectList = projectRepo.findAll();

    for (Project project:
            projectList) {
        System.out.println(project.getDescription());
    }

    HashMap<Project, Long> projectScoresHashMap = new HashMap<Project, Long>();


    // 遍历项目列表计算得分,结合发布时间等维度排序
    for (Project project:
            projectList) {

        project.calculateAndSetProjectScore();
        System.out.println(project.getProjectScore());
        long projectScore = project.getProjectScore();

        projectScoresHashMap.put(project, projectScore);

    }
    // 排序HashMap逻辑:

    // 把HashMap的Entry转为List做排序
    List<Map.Entry<Project, Long> > list =
            new LinkedList<Map.Entry<Project, Long> >(projectScoresHashMap.entrySet());

    // 按项目得分升序排序,如需降序可以调换o1和o2的位置
    Collections.sort(list, new Comparator<Map.Entry<Project, Long> >() {
        public int compare(Map.Entry<Project, Long> o1,
                           Map.Entry<Project, Long> o2)
        {
            return (o1.getValue()).compareTo(o2.getValue());
        }
    });


    // 把排序后的结果写入LinkedHashMap保证顺序
    HashMap<Project, Long> sortedMap = new LinkedHashMap<Project, Long>();

    int count = 0;

    for (Map.Entry<Project, Long> aa : list) {
        if (count < 10) {
            sortedMap.put(aa.getKey(), aa.getValue());
            System.out.println(aa.getKey() + " " + aa.getValue());
        }
        count++;
    }
    System.out.println("排序后Map元素:");
    sortedMap.entrySet().forEach(entry -> {
        System.out.println(entry.getKey() + " " + entry.getValue());
    });


    return sortedMap;
}

问题2:模板层Map键值取值逻辑颠倒

你的Map结构为键=Project项目对象,值=项目得分,但你在模板中错误将entry.value(也就是得分)赋值给了project变量,自然取不到项目的属性值。同时原表头和展示字段不匹配,也做了对应调整。

修正后模板代码:

<table>
    <thead>
    <tr>
        <th>排名</th>
        <th>项目ID</th>
        <th>项目地址</th>
        <th>已筹集金额</th>
        <th>目标金额</th>
        <th>项目得分</th>
        <th>发布时间</th>
    </tr>
    </thead>
    <tbody>
    <!-- 这里把entry.key作为Project对象,entry.value作为得分 -->
    <tr th:each="entry, stats : ${sortedMap}" th:with="project=${entry.key}, projectScore=${entry.value}">
        <td th:text="${stats.index + 1}">1</td>
        <!-- 这里替换成你Project类里实际的id属性名 -->
        <td th:text="${project.id}">100</td>
        <td th:text="${project.url}">示例地址</td>
        <td th:text="${project.amountContributed}">10000</td>
        <td th:text="${project.targets}">50000</td>
        <td th:text="${projectScore}">95</td>
        <td th:text="${#dates.format(project.publishedOn, 'yyyy年MM月dd日')}">2023年01月15日</td>
    </tr>
    </tbody>
</table>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 21:51:03