Spring全局异常处理机制-秒懂

现如今与前台交互大多数采用restful api调用,而一个良好的异常处理机制,可进一步提高用户体验。

方法:

  • @ControllerAdvice,@ExceptionHander()
  • 在父类的baseController方法上加上@ExceptionHander()

代码实现:

1.@ControllerAdvice,@ExceptionHander()

创建一个全局异常类,类上添加@ControllerAdvice和@ResponseBody返回json参数。也可以单独使用@RestControllerAdvice。且spring会扫描到此注解,所以无需配置注入bean
在方法上添加@ExceptionHander(value = “需拦截异常的class”),可以单独拦截某一个异常,也可以全拦截Excepiton。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(value = Exception.class)
public ResultBean allExceptionHandler(Exception ex){

}

@ExceptionHandler(value = 自定义异常.class)
public ResultBean exceptionHandler(Exception ex){

}

}
2.在父类的baseController方法上加上@ExceptionHander()

此方法与方法一类似,区别在于@ExcptionHander所在的类不一样。这个是在一个基类controller方法添加。
缺点在于每个controller必需继承基类baseController。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class BaseController {
@ExceptionHandler(value = Exception.class)
public ResultBean allExceptionHandler(Exception ex){

}
@ExceptionHandler(value = 自定义异常.class)
public ResultBean exceptionHandler(Exception ex){

}

}

@RestController
public class TestController extends BaseController{

}

优化

现在拦截了所有异常的处理,还有一种错误也需要处理。就是Servlet出现的500,404等错误也需要拦截处理。

代码实现:

首先要在web.xml定义servlet出现的错误处理,location填写处理接口路径

1
2
3
4
5
6
7
8
<error-page>
<error-code>500</error-code>
<location>/error/500</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404</location>
</error-page>

其次要在对应的controller进行自定义处理方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RequestMapping("error")
@RestController
public class ErrorController {

@RequestMapping("/404")
public ResultBean<String> handlerError404(){
return new ResultBean<>(404,"找不到该页面");
}

@RequestMapping("/500")
public ResultBean<String> handlerError500(){
return new ResultBean<>(500,"服务器处理失败");
}


}

待补充:

在springboot的servlet出现500的错误时是如何进行拦截出来的?


  Spring

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×