在Spring Boot应用中实现异常处理通常有以下几种方式:
1. Controller级别的异常处理:使用@ExceptionHandler
你可以使用@ExceptionHandler
注解来处理特定Controller中的异常。这让你能定义如何处理在你的Controller方法中抛出的异常。这是一个处理同一Controller内多个处理方法可能抛出的相同异常的有效方式。
@Controller
public class MyController {
@ExceptionHandler(DataNotFoundException.class)
public ResponseEntity<String> handleDataNotFound(DataNotFoundException exception) {
return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND);
}
}
这个例子中,如果在MyController
中任何一个请求映射方法抛出DataNotFoundException
,handleDataNotFound
方法就会被调用。
2. 全局异常处理:使用@ControllerAdvice
为了应用更全局的处理方式,你可以创建一个使用@ControllerAdvice
注解的类。里面可以定义一个或多个使用@ExceptionHandler
注解的方法,这些方法将应用于你的整个Spring应用程序。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(DataNotFoundException.class)
public ResponseEntity<String> handleDataNotFound(DataNotFoundException exception) {
return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleAllUncaughtException(Exception exception) {
// 确保日志记录下所有未捕获的异常
return new ResponseEntity<>("Internal server error", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在GlobalExceptionHandler
类中,所有的Controller都会应用@ExceptionHandler
中定义的行为。
3. @ResponseStatus
注解
你可以在自定义异常上使用@ResponseStatus
注解,这样当该异常被抛出时,Spring会自动使用这个注解描述的状态码作为HTTP响应状态码。
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Data not found")
public class DataNotFoundException extends RuntimeException {
// ...
}
4. 实现ErrorController
你可以创建一个控制器来实现ErrorController
接口,并定义@RequestMapping
来处理/error
路径,这是处理所有类型的错误的另一种方法。
@Controller
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
// 获取错误属性并显示自定义视图或返回信息
return "error";
}
@Override
public String getErrorPath() {
return "/error";
}
}
通过继承ErrorController
,你可以提供处理所有异常和错误的自定义逻辑。
5. ResponseEntityExceptionHandler
Spring提供了一个ResponseEntityExceptionHandler
基类,你可以扩展它来定制自己的异常处理逻辑。这个类在@ControllerAdvice
类中特别有用。
@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(DataNotFoundException.class)
protected ResponseEntity<Object> handleDataNotFound(
DataNotFoundException exception, HttpHeaders headers, HttpStatus status, WebRequest request) {
// 创建并返回适当的ResponseEntity对象
}
}
总结
Spring Boot提供了若干种灵活的异常处理方法。在实现异常处理时,你可以根据具体需求选择最适合你应用场景的策略。通常情况下,组合使用@ControllerAdvice
和@ExceptionHandler
对全局异常处理而且配置简单的情况下非常有用,而ErrorController
和ResponseEntityExceptionHandler
提供了更多的自定制灵活性。