@ControllerAdvice全局異常處理不起作用原因及解決辦法


這段時間使用springboot搭建基礎框架,作為springboot新手,各種問題都有。


當把前端框架搭建進來時,針對所有controller層的請求,所發生的異常,需要有一個統一的異常處理,然后返回錯誤頁面。其中方法很多,可以使用攔截器,或者filter,我是使用controlleradvice注解。

package org.lhzhian.base.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

/**
* 異常統一處理
* @author lhzhian
* @date 2016年4月28日
*/
@ControllerAdvice
public class GlobalExceptionHandler {

private final static String ERROR_PAGE = "error";

@ExceptionHandler(Exception.class)
public ModelAndView handle(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("message", e.getMessage());
mv.setViewName(ERROR_PAGE);
return mv;
}

}


定義了全局異常處理類GlobalExceptionHandler,當controller層的某個action拋出異常后,GlobalExceptionHandler就能捕獲到,把異常交給handle方法處理,該方法用
@ExceptionHandler注解,這是ControllerAdvice配套的注解,如有不明白之處,可以看看官方文檔。
    完成后,在controller的某個方法,故意拋出一個RuntimeException,如int a = 1 / 0; 但是不管怎么調試,始終沒有進入handle放開,找了很多資料和官方文檔,跟此
處使用的是一樣,一開始以為是配置問題,但是項目是使用springboot的,並不需要什么配置。后來不知道在哪個博客看到,定義了之后,要讓spring掃描到。於是我就開始
檢查springboot入口的main方法

@SpringBootApplication(scanBasePackages = "org.lhzhian")
public class Application {

public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}

}


問題就在scanBasePackages = "org.lhzhian",這樣是,spring ioc是掃描不到@ControllerAdvice的,也就根本沒有這個bean,自然也不會進入handle方法,所以為了讓
spring掃描到這個bean,我就試了下 scanBasePackages = {"org.lhzhian","org.lhzhian.base.exception"},結果果然進入handle了。
    
    總結:@ControllerAdvice注解的類,需要讓spring掃描到。
---------------------
作者:壯士斷臂
來源:CSDN
原文:https://blog.csdn.net/u011442760/article/details/73522098


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM