`@RestControllerAdvice` 是 Spring 框架中用于全局处理 RESTful 接口异常的注解。它结合了 `@ControllerAdvice` 和 `@ResponseBody` 的功能,主要用于处理 RESTful 接口抛出的异常,并以 JSON 格式返回错误信息。
### 主要作用:
- **全局异常处理**:`@RestControllerAdvice` 注解标记的类可以全局处理 RESTful 接口抛出的异常。
- **返回 JSON 响应**:异常处理方法在处理异常后会以 JSON 格式返回错误信息,适合 RESTful 接口。
### 特点和用法:
- 在类级别使用 `@RestControllerAdvice` 注解表示该类是一个全局异常处理类,用于处理所有 Controller 层抛出的异常。
- 通常结合 `@ExceptionHandler` 注解一起使用,用于标记处理特定异常的方法。
- 可以定义多个异常处理方法,每个方法处理不同类型的异常,以实现精确的异常处理逻辑。
- 异常处理方法可以返回自定义的错误信息,也可以返回标准的错误信息格式,如统一的 JSON 结构。
### 示例:
```java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse("Internal Server Error", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {
ErrorResponse errorResponse = new ErrorResponse("Resource Not Found", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
}
```
在上面的示例中,`GlobalExceptionHandler` 类使用 `@RestControllerAdvice` 注解来全局处理异常。它包含了两个异常处理方法,分别处理 `Exception` 和 `ResourceNotFoundException` 类型的异常,并返回自定义的错误信息以及对应的 HTTP 状态码。
除了使用全局异常处理机制(如 `@RestControllerAdvice`)来处理 RESTful 接口的异常外,Spring 还提供了其他方式来处理单个异常。以下是处理单个异常的一些常见方法:
### 1. **在 Controller 中处理异常:**
在 Controller 类的方法中直接使用 `@ExceptionHandler` 注解来处理特定异常,这种方法适用于局部异常处理。
```java
@Controller
public class MyController {
@ExceptionHandler(MyCustomException.class)
public ResponseEntity<ErrorResponse> handleCustomException(MyCustomException ex) {
ErrorResponse errorResponse = new ErrorResponse("Custom Error", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
}
```
### 2. **在 Service 层处理异常:**
在 Service 层捕获异常并处理,然后将处理后的结果返回给 Controller 层。
```java
@Service
public class MyService {
public void doSomething() {
try {
// Code that may throw an exception
} catch (MyCustomException ex) {
// Handle the exception
throw ex; // or return a specific result
}
}
}
```
### 3. **使用 AOP(面向切面编程)处理异常:**
通过 AOP 可以将异常处理逻辑从业务逻辑中分离出来,提高代码的模块化和复用性。
```java
@Aspect
@Component
public class ExceptionAspect {
@AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
public void handleException(MyCustomException ex) {
// Handle the exception
}
}
```
### 4. **自定义异常处理器:**
实现 `HandlerExceptionResolver` 接口,自定义异常处理器来处理特定异常。
```java
@Component
public class CustomExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// Custom exception handling logic
return new ModelAndView("error", "message", ex.getMessage());
}
}
```
这些方法可以根据具体情况选择合适的方式来处理特定的异常,从而实现更灵活和精细的异常处理逻辑。