Spring Boot页面无法展示Slot对象列表,求排查问题原因
你遇到的这个「只有表格表头、没有数据展示」的问题,核心原因大概率是控制器注解用错了,另外还有几个潜在排查点,我帮你一步步梳理:
1. 最关键的问题:@RestController 注解误用
你在AdminController上标注了@RestController,这个注解是@Controller + @ResponseBody的组合——它的作用是让方法返回的对象直接序列化为JSON/XML作为HTTP响应体,不会触发视图解析器去渲染Thymeleaf页面。
也就是说,你返回的ModelAndView并没有被用来渲染页面,而是被直接转成JSON返回了,页面自然拿不到slots数据。
解决方法:
把@RestController替换成@Controller:
@Controller // 替换原来的@RestController public class AdminController { @GetMapping("/admin/slots") public ModelAndView getSlots() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("admin/slots"); List<Slot> slots = .. get slots from other service .. modelAndView.addObject("slots", slots); // 可以加一行日志验证数据是否存在 System.out.println("当前加载的Slots数量:" + slots.size()); return modelAndView; } }
2. 验证slots列表是否真的有数据
有时候服务调用看似成功,但实际返回的是空列表,这也会导致表格无数据。建议在控制器里打印列表长度,确认是否有数据被传递到视图层。
3. 检查Thymeleaf视图文件的位置
Spring Boot默认的Thymeleaf视图存放路径是src/main/resources/templates/,所以你的slots.html必须放在src/main/resources/templates/admin/slots.html,确保路径和modelAndView.setViewName("admin/slots")完全对应。
4. 优化Thymeleaf表达式写法(非必须,但更规范)
Thymeleaf支持直接通过属性名访问对象字段(它会自动调用对应的getter方法),你可以把视图里的${slot.getId()}改成更简洁的${slot.id},其他字段同理:
<tr th:each="slot : ${slots}"> <td th:text="${slot.id}"></td> <td th:text="${slot.startTime}"></td> <td th:text="${slot.finishTime}"></td> <td th:text="${slot.title}"></td> <td th:text="${slot.description}"></td> </tr>
优先尝试替换控制器注解,这应该是解决问题的核心;如果还是不行,再依次排查后面的几点。
内容的提问来源于stack exchange,提问作者user468587

