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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:02:50