「显示已删除影片」复选框功能异常排查——视频租赁应用软删除场景下列表更新失效问题
搞定你的软删除恢复功能!
嘿,我一眼就揪出你代码里的小bug了——问题完全出在updateList()方法的逻辑上!
核心问题:重复设置网格内容覆盖了结果
看你这段代码:
private void updateList() { if (showDeleted.getValue() == true) { grid.setItems(service.findAllDeletedMovies()); } grid.setItems(service.findAllMovies(filterText.getValue())); }
哪怕showDeleted是true,你先把网格设置成已删除的电影列表,紧接着又调用了findAllMovies()把内容替换成正常电影!这不就等于白忙活了嘛,最后永远显示的都是未删除的内容。
修复方案:给逻辑加个else分支
把代码改成这样,让两种显示情况互斥:
private void updateList() { // 先判断复选框的值,避免空指针 boolean shouldShowDeleted = showDeleted.getValue() != null && showDeleted.getValue(); if (shouldShowDeleted) { // 显示已删除的电影 grid.setItems(service.findAllDeletedMovies()); } else { // 显示正常电影(带过滤) grid.setItems(service.findAllMovies(filterText.getValue())); } }
我加了showDeleted.getValue() != null的判断,是因为Checkbox组件刚初始化时,值可能是null,直接判断== true会有潜在的空指针风险。
额外可以检查的点
- 确认监听器真的触发了:可以在
updateList()开头加个System.out.println("updateList called, showDeleted: " + showDeleted.getValue());,看看复选框点击时方法有没有执行。 - 验证JPA查询是否正确:在
findAllDeletedMovies()方法里加个日志,打印返回的列表大小,比如System.out.println("Found deleted movies: " + movieRepository.findAllIsDeleted().size());,排查是不是查询本身没拿到数据。 - Spring事务与缓存:如果是Spring项目,确保你的查询方法都在事务范围内,避免JPA一级缓存导致的旧数据问题——可以给查询方法加上
@Transactional(readOnly = true)注解。
对了,你说的是恢复「已删除」客户,但代码里都是Movie类,应该是笔误吧?不过这不影响核心问题的解决~
内容的提问来源于stack exchange,提问作者Soccan
相关产品推荐
相关产品推荐

