问题本质分析
删除不存在ID返回成功属于业务逻辑缺陷,会导致两个问题:
-
前端无法感知无效操作
-
影响数据操作的可信度
解决方案
1. 基础版校验(推荐)
@ApiOperation("删除供应商信息")
@DeleteMapping("/{id}")
public ResponseResult deleteSupplier(@PathVariable Long id) {
// 先查询是否存在
MsSupplier entity = supplierService.getById(id);
if (entity == null || "1".equals(entity.getDelFlag())) {
throw new BusinessException("指定供应商不存在");
}
// 执行删除(逻辑删除)
boolean result = supplierService.logicDelete(id);
return result ? ResponseResult.success() : ResponseResult.error();
}
2. 高效版校验(基于SQL影响行数)
public ResponseResult deleteSupplier(@PathVariable Long id) {
// 直接执行更新操作
int affectedRows = supplierMapper.logicDeleteById(id);
return affectedRows > 0
? ResponseResult.success()
: ResponseResult.error(404, "供应商不存在");
}
3. 增强版(带完整校验链)
@Transactional
public ResponseResult deleteSupplier(@PathVariable Long id) {
// 存在性校验
if (!supplierService.existValidSupplier(id)) {
throw new BusinessException(ErrorCode.SUPPLIER_NOT_EXIST);
}
// 关联数据校验
if (orderService.hasRelatedOrders(id)) {
throw new BusinessException(ErrorCode.SUPPLIER_HAS_RELATIONS);
}
// 执行删除
supplierService.logicDelete(id);
return ResponseResult.success();
}
优化措施
-
统一异常处理(在原有全局处理器中补充):
@ExceptionHandler(BusinessException.class)
public ResponseEntity<ErrorResult> handleBusinessException(BusinessException ex) {
return ResponseEntity.status(ex.getCode())
.body(new ErrorResult(ex.getMessage()));
}
-
错误码枚举:
public enum ErrorCode {
SUPPLIER_NOT_EXIST(4041001, "供应商不存在"),
SUPPLIER_HAS_RELATIONS(4001002, "存在关联业务单据");
private final int code;
private final String msg;
}
-
响应结构标准化:
// 成功
{
"code": 200,
"data": null
}
// 失败
{
"code": 4041001,
"msg": "供应商不存在"
}
各方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 基础版 | 实现简单,逻辑清晰 | 多一次查询请求 | 数据量小的系统 |
| 高效版 | 无额外查询,性能最优 | 依赖SQL执行结果判断 | 高并发场景 |
| 增强版 | 业务校验最完整,防御性最好 | 实现复杂度最高 | 核心业务模块 |
推荐实践
-
生产环境建议使用高效版,通过
UPDATE ... WHERE id=? AND del_flag=0语句,利用数据库返回的影响行数判断有效性 -
关键业务模块建议增加增强版校验,确保业务完整性
-
前端需要根据
404状态码做相应提示处理
通过以上优化,系统可以实现:
✅ 精确反馈操作结果
✅ 防止无效删除操作
✅ 保持接口响应符合RESTful规范
✅ 提升系统整体可靠性

被折叠的 条评论
为什么被折叠?



