Spring Boot CRUD操作中Delete方法报500错误,求排查指导
问题分析与修复方案
代码中的核心问题
- 死循环触发500错误:第一个for循环里嵌套了
while(gig != null),gig是增强for循环的迭代元素,只要当前gig不为null,这个while就会无限循环,直接导致请求超时或栈溢出,引发500错误。 - 删除逻辑完全错误:找到匹配name的Grocery时,调用
rss.deleteAll()会删除数据库中所有Grocery数据,而非指定的匹配行,违背需求。 - 存在性判断逻辑颠倒:第二个for循环的逻辑是“只要有一个Grocery的name不等于传入值就抛异常”,正确逻辑应该是遍历完所有数据都没找到匹配项,才抛出异常或返回提示。
- 潜在空指针风险:若某个Grocery的
name字段为null,调用gig.getName().equals(name)会抛出NullPointerException,触发500错误。
修复后的代码示例
public String deletedList(String name) { // 直接查询匹配name的数据,避免全表遍历 List<Grocery> matchedGroceries = rss.findByName(name); if (!matchedGroceries.isEmpty()) { // 删除所有匹配的行(支持同名多行删除) rss.deleteAll(matchedGroceries); return "success"; } // 未找到匹配数据时抛出异常 throw new DeleteException("Not Found"); }
额外优化建议
- 在GroceryRepository中定义
List<Grocery> findByName(String name);方法,避免全表查询,提升性能。 - 处理name参数为null的情况,避免后续逻辑出错。
- 若只需删除单行,可改用Optional处理:
public String deletedList(String name) { Optional<Grocery> groceryOpt = rss.findByName(name); if (groceryOpt.isPresent()) { rss.delete(groceryOpt.get()); return "success"; } throw new DeleteException("Not Found"); }
内容的提问来源于stack exchange,提问作者Maniverse
相关产品推荐
相关产品推荐

