如何在SpringBoot应用中实现异常处理?

在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中任何一个请求映射方法抛出DataNotFoundExceptionhandleDataNotFound方法就会被调用。

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对全局异常处理而且配置简单的情况下非常有用,而ErrorControllerResponseEntityExceptionHandler提供了更多的自定制灵活性。

相关推荐
薛定谔的算法6 小时前
phoneGPT:构建专业领域的检索增强型智能问答系统
前端·数据库·后端
RoyLin7 小时前
TypeScript设计模式:责任链模式
前端·后端·typescript
RoyLin7 小时前
TypeScript设计模式:装饰器模式
前端·后端·typescript
Java中文社群7 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心7 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
掘金一周7 小时前
Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架 | 掘金一周 9.18
前端·人工智能·后端
moisture7 小时前
CUDA常规知识点
后端·面试
用户298698530147 小时前
Java 使用 Spire.PDF 将PDF文档转换为Word格式
java·后端
后端小张7 小时前
基于飞算AI的图书管理系统设计与实现
spring boot
Reboot7 小时前
使用cloc统计代码行数
后端