這段時(shí)間使用springboot搭建基礎(chǔ)框架,作為springboot新手诸衔,各種問題都有。
當(dāng)把前端框架搭建進(jìn)來時(shí)颇玷,針對所有controller層的請求笨农,所發(fā)生的異常,需要有一個(gè)統(tǒng)一的異常處理帖渠,然后返回錯(cuò)誤頁面谒亦。其中方法很多,可以使用攔截器空郊,或者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層的某個(gè)action拋出異常后锁摔,GlobalExceptionHandler就能捕獲到,把異常交給handle方法處理哼审,該方法用
@ExceptionHandler注解谐腰,這是ControllerAdvice配套的注解孕豹,如有不明白之處,可以看看官方文檔十气。
完成后励背,在controller的某個(gè)方法,故意拋出一個(gè)RuntimeException砸西,如int a = 1 / 0; 但是不管怎么調(diào)試叶眉,始終沒有進(jìn)入handle放開,找了很多資料和官方文檔芹枷,跟此
處使用的是一樣衅疙,一開始以為是配置問題,但是項(xiàng)目是使用springboot的杖狼,并不需要什么配置炼蛤。后來不知道在哪個(gè)博客看到妖爷,定義了之后蝶涩,要讓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的,也就根本沒有這個(gè)bean次舌,自然也不會進(jìn)入handle方法熄攘,所以為了讓
spring掃描到這個(gè)bean,我就試了下 scanBasePackages = {"org.lhzhian","org.lhzhian.base.exception"}彼念,結(jié)果果然進(jìn)入handle了挪圾。
總結(jié):@ControllerAdvice注解的類,需要讓spring掃描到逐沙。