Spring中@ControllerAdvice注解配合@ExceptionHandler实现统一异常处理

7 篇文章 0 订阅
7 篇文章 0 订阅

在spring 3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute并应用到所有@RequestMapping中。参考:@ControllerAdvice 文档

 

从注解的名很清楚的知道,该注解是一个面向切面编程的用于controller方法增强的注解,@ControllerAdvice的实现:

@Target(ElementType.TYPE)  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
@Component  
public @interface ControllerAdvice {  
} 

  • @ControllerAdvice详解

先看以下代码:

    @ControllerAdvice  
    public class GlobalExceptionHandler {  
      
        /**
         * 应用到所有@RequestMapping注解方法,在其执行之前把返回值放入Model
         */
        @ModelAttribute  
        public void newUser() {  
        }  
      
        /**
         * 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
         */
        @InitBinder  
        public void initBinder(WebDataBinder binder) {    
        }  
      
        /**
         * 应用到所有@RequestMapping注解的方法,在其抛出BusinessException异常时执行
         */
        @ExceptionHandler(BusinessException.class)  
        @ResponseBody
        public ApiResult<String> businessExceptionHandler(HttpServletRequest req, BusinessException e) throws Exception {
            ApiResult<String> apiResult = new ApiResult<>();
            apiResult.fail(e.getMessage());
            return apiResult;
        }
    }

使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法,都会作用于使用@RequestMapping注解的方法上。

  • 自定义统一异常处理

1.编写自定义异常类:

public class BusinessException extends RuntimeException {

    public BusinessException() {
         super();
    }
    
    public BusinessException(String message) {
        super(message);
    }
}

2.编写全局异常处理类:

@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Log logger = LogFactory.getLog(GlobalExceptionHandler.class);

    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public ApiResult<String> businessExceptionHandler(HttpServletRequest req, BusinessException e) throws Exception {
        ApiResult<String> apiResult = new ApiResult<>();
        apiResult.fail(e.getMessage());
        return apiResult;
    }
    
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ApiResult<String> exceptionHandler(HttpServletRequest req, Exception e) throws Exception {
        ApiResult<String> apiResult = new ApiResult<>();
         logger.error(e.getMessage(), e);
         apiResult.dataError();
        return apiResult;
    }

}

通过以上代码编写之后,只要是使用@RequestMapping注解的方法,抛出BusinessException和Exception都会自动统一调用businessExceptionHandler和exceptionHandler方法,进行异常处理。

补充:如果统一异常处理都需要返回json,那么可以使用@RestControllerAdvice注解来代替@ControllerAdvice,这样就可不需要添加@ResponseBody。


当我们在编写 Spring MVC 应用程序时,我们可以使用 @ControllerAdvice 注解或者在 Controller 使用 @ExceptionHandler 注解来处理异常。@ControllerAdvice 注解可以用于全局异常处理,而 @ExceptionHandler 注解则用于处理特定的异常。 下面是一个使用 @ControllerAdvice 注解处理异常的示例: ``` @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception e) { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.setViewName("error"); return mav; } } ``` 在上面的示例,我们定义了一个名为 GlobalExceptionHandler 的类,并使用 @ControllerAdvice 注解将其标记为全局异常处理器。我们还使用 @ExceptionHandler 注解来处理 Exception 类型的异常。当应用程序出现 Exception 类型的异常时,Spring MVC 将会调用 handleException 方法来处理该异常,并返回一个包含异常信息的 ModelAndView 对象。 如果我们想要在 Controller 处理特定的异常,我们可以使用 @ExceptionHandler 注解。下面是一个使用 @ExceptionHandler 注解处理特定异常的示例: ``` @Controller public class UserController { @ExceptionHandler(UserNotFoundException.class) public ModelAndView handleUserNotFoundException(UserNotFoundException e) { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.setViewName("userNotFound"); return mav; } @GetMapping("/users/{id}") public String getUser(@PathVariable Long id) { User user = userService.getUserById(id); if (user == null) { throw new UserNotFoundException("User not found with id " + id); } return "userDetails"; } } ``` 在上面的示例,我们定义了一个名为 UserController 的类,并使用 @Controller 注解将其标记为一个 Controller。我们还使用 @ExceptionHandler 注解来处理 UserNotFoundException 类型的异常。当应用程序出现 UserNotFoundException 类型的异常时,Spring MVC 将会调用 handleUserNotFoundException 方法来处理该异常,并返回一个包含异常信息的 ModelAndView 对象。 另外,我们还定义了一个名为 getUser 的方法来获取用户信息。如果用户不存在,我们将会抛出一个 UserNotFoundException 异常,该异常将会被 handleUserNotFoundException 方法处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐只乐之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值