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
相关产品推荐
相关产品推荐

