springboot 多模块全局异常处理
时间: 2025-01-02 12:31:43 浏览: 10
### 实现 Spring Boot 多模块项目的全局异常处理
在构建复杂的多模块应用程序时,确保一致性和可维护性的全局异常处理机制至关重要。通过定义统一的错误响应结构和集中化的异常处理器,可以提高系统的健壮性和用户体验。
#### 使用 `@ControllerAdvice` 注解创建全局异常处理器类
为了捕获整个应用中的未处理异常并提供友好的反馈给客户端,推荐使用带有 `@ControllerAdvice` 的控制器增强器来实现全局异常管理功能[^1]:
```java
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice(basePackages = {"com.example.moduleA", "com.example.moduleB"})
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse(
HttpStatus.INTERNAL_SERVER_ERROR.value(),
"Unexpected server error",
System.currentTimeMillis()
);
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
```
此方法允许开发者指定哪些包下的异常会被该顾问所拦截,并返回标准化的 JSON 错误消息体。
#### 定义自定义异常及其对应的 HTTP 响应状态码映射表
对于业务逻辑层面可能出现的具体场景,建议封装成特定类型的运行期异常,并为其分配合适的HTTP状态码以便于前端解析:
```java
// Custom exceptions with status codes mapping
public class ResourceNotFoundException extends RuntimeException {
private final int statusCode;
public ResourceNotFoundException(String message, int statusCode){
super(message);
this.statusCode = statusCode;
}
// Getter for statusCode...
}
// Update the global handler accordingly
@ExceptionHandler(ResourceNotFoundException.class)
protected ResponseEntity<Object> handleResourceNotFound(RuntimeException ex) {
ApiError apiError = new ApiError(((ResourceNotFoundException)ex).getStatusCode(), ex.getMessage());
return buildResponseEntity(apiError);
}
```
这样做的好处是可以更精确地传达问题所在以及指导下一步操作方向。
#### 配置跨多个子模块共享相同的异常处理策略
当项目被拆分为若干独立但又相互关联的小型服务单元时,可以通过引入公共依赖库的方式让各个部分都能继承同样的异常捕捉行为而无需重复编写相同代码片段。这不仅减少了冗余还增强了协作效率。
阅读全文