在Spring Boot应用中实现异常处理通常有以下几种方式:
1. Controller级别的异常处理:使用@ExceptionHandler
你可以使用@ExceptionHandler注解来处理特定Controller中的异常。这让你能定义如何处理在你的Controller方法中抛出的异常。这是一个处理同一Controller内多个处理方法可能抛出的相同异常的有效方式。
            
            
              java
              
              
            
          
          @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应用程序。
            
            
              java
              
              
            
          
          @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响应状态码。
            
            
              java
              
              
            
          
          @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Data not found")
public class DataNotFoundException extends RuntimeException {
    // ...
}
        4. 实现ErrorController
你可以创建一个控制器来实现ErrorController接口,并定义@RequestMapping来处理/error路径,这是处理所有类型的错误的另一种方法。
            
            
              java
              
              
            
          
          @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类中特别有用。
            
            
              java
              
              
            
          
          @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提供了更多的自定制灵活性。