使用@ControllerAdvice
和@ExceptionHandler
这是Spring提供的一种非常方便的方式来处理控制器层抛出的异常。你可以创建一个带有@ControllerAdvice
注解的类,并在其中定义@ExceptionHandler
方法来捕获和处理特定的异常。
public class GlobalExceptionHandler {
public ResponseEntity<Object> handleException(Exception e) {
// 日志记录
e.printStackTrace();
// 返回错误信息
return new ResponseEntity<>("An error occurred", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
使用@RestControllerAdvice
如果你的全局异常处理器需要返回JSON格式的响应,可以使用@RestControllerAdvice
注解,这样返回的对象会自动被Spring序列化为JSON。
public class GlobalExceptionHandler {
public ResponseEntity<Object> handleException(Exception e) {
// 日志记录
e.printStackTrace();
// 返回错误信息
return new ResponseEntity<>("An error occurred", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
使用ResponseEntityExceptionHandler
如果你希望捕获的是REST控制器抛出的异常,而不是Spring MVC控制器抛出的异常,你可以通过继承ResponseEntityExceptionHandler
类来创建一个自定义的异常处理器。这种方法更适合处理REST API中的异常。
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
protected ResponseEntity<Object> handleConflict(Exception ex) {
// 日志记录
ex.printStackTrace();
// 返回错误信息
return new ResponseEntity<>("An error occurred", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
使用@ExceptionHandler
在具体控制器中处理异常
虽然这种方法不是全局的,但它可以在单个控制器或一组控制器中捕获和处理异常。这对于特定场景下的异常处理很有用。例如:
public class SpecificExceptionHandler {
public ResponseEntity<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
// 日志记录或返回错误信息等处理逻辑...
return new ResponseEntity<>("Validation failed", HttpStatus.BAD_REQUEST); // 返回400 Bad Request状态码和错误信息。
}
}