应通过自定义运行时异常处理商品上下架状态非法问题:定义productstatusexception等业务异常类,在service中校验状态并抛出,用@controlleradvice统一拦截返回400响应,前端解析message友好提示用户。

当商品上下架状态非法(比如下架中的商品重复下架、上架中的商品重复上架,或状态流转不符合业务规则)时,可通过自定义异常主动抛出错误,中断操作并明确提示问题。核心是:定义异常类 + 在状态校验处 throw + 调用方捕获处理。
定义商品状态相关自定义异常
继承 RuntimeException(运行时异常,无需强制 try-catch),命名体现业务含义:
public class ProductStatusException extends RuntimeException {
public ProductStatusException(String message) {
super(message);
}
public ProductStatusException(String message, Throwable cause) {
super(message, cause);
}
}
也可按场景细分,如 ProductAlreadyOnlineException、ProductOfflineNotAllowedException,便于后续统一拦截或日志分类。
在状态变更逻辑中做校验并抛出
以「上架商品」为例,在 service 方法中先检查当前状态是否允许上架:
- 若商品已是
ONLINE状态,抛出异常提示“商品已在售,不可重复上架” - 若商品为
DELETED或REJECTED等禁止恢复的状态,抛出异常说明“该商品无法重新上架” - 校验通过后才更新数据库状态
public void onlineProduct(Long productId) {
Product product = productMapper.selectById(productId);
if (product == null) {
throw new ProductStatusException("商品不存在:" + productId);
}
if (ProductStatus.ONLINE.equals(product.getStatus())) {
throw new ProductStatusException("商品[" + productId + "]已在售,不可重复上架");
}
if (!ProductStatus.CAN_BE_ONLINED.contains(product.getStatus())) {
throw new ProductStatusException("商品状态为[" + product.getStatus() + "],不支持上架操作");
}
product.setStatus(ProductStatus.ONLINE);
productMapper.updateById(product);
}
统一处理异常(可选但推荐)
使用 @ControllerAdvice 拦截自定义异常,返回结构化错误响应:
- HTTP 状态码设为
400 Bad Request或422 Unprocessable Entity - 响应体包含错误码、提示信息(避免暴露敏感细节)
- 记录日志(含堆栈、商品 ID、操作人等)便于排查
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ProductStatusException.class)
public ResponseEntity<errorresponse> handleProductStatusException(
ProductStatusException e) {
log.warn("商品状态异常:{}", e.getMessage(), e);
return ResponseEntity.badRequest()
.body(new ErrorResponse("PRODUCT_STATUS_INVALID", e.getMessage()));
}
}
</errorresponse>
调用方感知与反馈
前端或上游系统收到 400 响应后,应解析 message 字段,友好提示用户(如“该商品已上架,请勿重复操作”),而不是显示“服务器错误”。后端测试时,可用单元测试验证异常是否正确抛出:
@Test
void shouldThrowExceptionWhenOnlineAlreadyOnline() {
assertThrows<productstatusexception>(() ->
productService.onlineProduct(1001L));
}
</productstatusexception>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











