Skip to content

nthack/Multi-ControllerAdvice-Demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 

Repository files navigation

基本概述

环境描述

开发环境

POM依赖

Application.yml配置

  • 项目端口: 8080
  • 本地地址:localhost:8080


基本概念

Spring Boot全局异常处理

通常来说,在Spring Boot Web项目中,有些异常信息是需要返回给调用者的。例如一些业务异常:账号异常、某个具体业务异常等。不同的异常有时候可能需要做不同的处理,一般项目中都会有多个异常。

基本上为了代码可读性和整洁,很少会在Controller中try-catch捕获service抛出的异常。除了在某个Controller的方法中使用@ExceptionHandler外,更多情况下是使用@ControllerAdvice配合@ExceptionHandler进行全局的异常捕获和处理,方便快捷。

PS. 控制好异常的生命周期(抛出及捕获)对于一个攻城狮来说很重要

关于@ControllerAdvice注解

相信很多人都比较熟悉这个注解,简单说下,一般这个注解用于:

  1. 全局数据绑定,@ModelAttribute
  2. 全局数据预处理@InitBinder
  3. 全局异常处理@ExceptionHandler

通常主要用于全局异常处理,也是本篇主要说的,下面使用@ControllerAdvice注解的类统称为全局异常处理类



全局异常处理类

全局异常处理类主要分为:

单个全局异常处理类

当抛出的异常种类不多的时候,一般使用单个@ControllerAdvice注解的类并配合@ExceptionHandler即可.

例子

假设现在分别有:BusinessExceptionAccountExceptionException这三个异常,只要controller中没有进行try-catch,就进行全局异常处理,为了简单实现,这三个异常都会在Controller中直接抛出。

所属分支

git checkout single_controller_advice

测试

执行Application.java 访问对应的api:

  • /account - 抛出账户异常
  • /business - 抛出业务异常
  • /exception - 抛出通用异常(一般很少抛出非RuntimeException的异常,防止傻逼兜底用的)

主要的全局异常处理类GlobalExceptionHandler.java

下面代码中的三个方法,分别对应处理ThrowExceptionsController.java中抛出的:BusinessExceptionAccountExceptionException三个异常,异常抛出位置可以在Service也可以在Controller,看具体需要。

@ControllerAdvice
public class GlobalExceptionHandler {
    
  @ExceptionHandler(BusinessException.class)
  public ResponseEntity handleBusinessException(BusinessException ex){
    ...
  }

  
  @ExceptionHandler(AccountException.class)
  public ResponseEntity handleAccountException(AccountException ex){
    ...
  }

  
  @ExceptionHandler(Exception.class)
  public ResponseEntity handleException(Exception ex){
    ...
  }
}

多个全局异常处理类

About

MultiControllerAdviceDemo for Spring boot

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages