如何在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提供了更多的自定制灵活性。

相关推荐
我是一颗柠檬9 分钟前
【Java后端技术亮点】动态路由权限(按钮级权限),细粒度控制到按钮级别
java·开发语言·后端·状态模式
前端Hardy16 分钟前
CSS 动画真的比 JS 快?Josh Comeau 做了组实验,结果跟直觉不一样
前端·javascript·后端
Front思16 分钟前
调取支付宝支付正式环境不可以唤起来,但是沙箱可以
后端
foggyprojects23 分钟前
AI 生成 SQL 模板以后,为什么还需要固定 helper 规则
后端
明天一点23 分钟前
Cloudflare 通知转发钉钉机器人
前端·后端
前端Hardy24 分钟前
前端日历组件,要变天了?Schedule-X v4.6 彻底杀疯了
前端·javascript·后端
Oo_行者_oO31 分钟前
微服务 Feign 从“万能公共服务”到“业务客户端”
后端·架构
wei_shuo32 分钟前
别再踩坑了!KingbaseES 存储过程与触发器开发避坑实录
后端
元宝骑士33 分钟前
MySQL 实战:跨表排序 + 指定类型置顶四种写法
后端·mysql
ConardLi1 小时前
啊?我刚开源的 Skills 已经 7K Star 了?!
前端·人工智能·后端