现如今与前台交互大多数采用restful api调用,而一个良好的异常处理机制,可进一步提高用户体验。
方法:
- @ControllerAdvice,@ExceptionHander()
- 在父类的baseController方法上加上@ExceptionHander()
代码实现:
1.@ControllerAdvice,@ExceptionHander()
创建一个全局异常类,类上添加@ControllerAdvice和@ResponseBody返回json参数。也可以单独使用@RestControllerAdvice。且spring会扫描到此注解,所以无需配置注入bean
在方法上添加@ExceptionHander(value = “需拦截异常的class”),可以单独拦截某一个异常,也可以全拦截Excepiton。
@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。
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填写处理接口路径
<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进行自定义处理方法
@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的错误时是如何进行拦截出来的?