這段時間使用springboot搭建基礎(chǔ)框架,作為springboot新手,各種問題都有。
當(dāng)把前端框架搭建進來時,針對所有controller層的請求,所發(fā)生的異常,需要有一個統(tǒng)一的異常處理,然后返回錯誤頁面。其中方法很多,可以使用攔截器,或者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;
/**
* 異常統(tǒng)一處理
* @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,當(dāng)controller層的某個action拋出異常后,GlobalExceptionHandler就能捕獲到,把異常交給handle方法處理,該方法用
@ExceptionHandler注解,這是ControllerAdvice配套的注解,如有不明白之處,可以看看官方文檔。
完成后,在controller的某個方法,故意拋出一個RuntimeException,如int a = 1 / 0; 但是不管怎么調(diào)試,始終沒有進入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"},結(jié)果果然進入handle了。
總結(jié):@ControllerAdvice注解的類,需要讓spring掃描到。