Spring Boot心愿单应用无法显示愿望表格问题求助
问题分析与修复方案
1. 重定向导致Model属性丢失(核心原因)
你的控制器方法在添加oensker到Model后,返回的是重定向:
@GetMapping("/createOenskeseddel") public String index(Model model) { List<Ønske> ønskeList= ønskeService.fetchAll(); model.addAttribute("oensker",ønskeList); return "redirect:Home/createOenskeseddel"; }
重定向是客户端发起新请求,原请求的Model数据不会被传递到新请求中,所以页面无法获取oensker变量,IDE提示无法解析就是这个原因。
修复:直接返回视图名称,取消重定向:
@GetMapping("/createOenskeseddel") public String index(Model model) { List<Ønske> ønskeList = ønskeService.fetchAll(); model.addAttribute("oensker", ønskeList); // 直接返回视图路径(假设视图文件为Home/createOenskeseddel.html) return "Home/createOenskeseddel"; }
2. Repository查询逻辑错误:查询范围与字段冲突
当前fetchAll()用INNER JOIN查询所有用户的愿望关联数据,存在两个问题:
- 返回所有用户的愿望,不符合“用户只能查看自己愿望”的业务逻辑
- INNER JOIN后两张表的
bruger_id字段重复,BeanPropertyRowMapper无法正确映射,可能导致列表为空或属性值错误
修复:
方案一:查询当前登录用户的愿望(推荐)
先获取当前登录用户ID,再查询其专属愿望:
// Repository层新增方法 public List<Ønske> fetchByBrugerId(int brugerId) { String sql = "SELECT * FROM oenske WHERE bruger_id = ?"; RowMapper<Ønske> rowMapper = new BeanPropertyRowMapper<>(Ønske.class); return template.query(sql, rowMapper, brugerId); } // 控制器层修改逻辑 @GetMapping("/createOenskeseddel") public String index(Model model) { // 获取当前登录用户ID(根据你的登录实现调整,示例用Spring Security) Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Bruger currentUser = brugerService.findByUsername(auth.getName()); List<Ønske> ønskeList = ønskeService.fetchByBrugerId(currentUser.getBrugerId()); model.addAttribute("oensker", ønskeList); return "Home/createOenskeseddel"; }
方案二:关联查询时指定字段避免冲突
如果需要用户表信息,明确指定查询字段,避免重复:
public List<Ønske> fetchByBrugerId(int brugerId) { String sql = "SELECT oenske.oenske_id, oenske.navn, oenske.beskrivelse, oenske.link, oenske.bruger_id " + "FROM oenske INNER JOIN bruger ON oenske.bruger_id = bruger.bruger_id " + "WHERE oenske.bruger_id = ?"; RowMapper<Ønske> rowMapper = new BeanPropertyRowMapper<>(Ønske.class); return template.query(sql, rowMapper, brugerId); }
3. 页面操作链接错误:使用愿望ID而非用户ID
当前删除/编辑链接用oenske.bruger_id,会导致操作整个用户的愿望,而非单个愿望:
<a th:href="@{'/sletØnske/'+${oenske.bruger_id}}">
修复:改为愿望的唯一ID(比如oenske_id,根据表结构调整):
<a th:href="@{'/sletØnske/'+${oenske.oenskeId}}"> <button class="btn-sletØnske" id="btn-sletØnske">Slet dette ønske</button> </a> <a th:href="@{'/redigerØnske/'+${oenske.oenskeId}}"> <button class="btn-redigerØnske" id="btn-redigerØnske">Rediger</button> </a>
同时对应控制器方法要接收愿望ID参数,而非用户ID。
4. 验证数据传递有效性
在控制器中添加日志,确认愿望列表是否有数据:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(YourController.class); @GetMapping("/createOenskeseddel") public String index(Model model) { // ... 获取当前用户和愿望列表的代码 logger.info("当前用户的愿望数量:{}", ønskeList.size()); model.addAttribute("oensker", ønskeList); return "Home/createOenskeseddel"; }
如果日志显示数量为0,需检查数据库中是否存在该用户的愿望数据。
内容的提问来源于stack exchange,提问作者Geargrind
相关产品推荐
相关产品推荐

