背景
项目中,Controller分一般的视图控制器和RestController两种,前者主要面向有显示需求的浏览器用户,后者则主要面向接口使用者。异常反馈的形式也因此有所区分。
实现方式
- 利用 @ControllerAdvice 实现全局异常处理
- 利用 @ControllerAdvice 的 “basePackages”属性,作针对性区分
操作示例
- 针对两种Controller,作物理上的区分,即建立“CommonController”和“RestController”包,来分别放置。
- 针对两个包,分别建立异常处理类:
// 返回视图(需搭配页面模板 /error)
@Slf4j
@ControllerAdvice("xxx.CommonController")
public class GlobalExceptionHandlerForCommon {
// 全局异常拦截
@ExceptionHandler
public String handlerExceptions(Model model, RedirectAttributes attrs, Exception e, HttpServletRequest request) {
log.info("全局异常---------------");
e.printStackTrace();
// 判断场景值,定制化异常信息
String msg;
if (e instanceof NotLoginException) {
// 如果是未登录异常
// NotLoginException ee = (NotLoginException) e;
// msg = "未登录:" + ee.getMessage();
attrs.addFlashAttribute("msg","Please login");
attrs.addFlashAttribute("lastUrl",request.getRequestURL());
return "redirect:/login";
} else if (e instanceof NotRoleException) {
// 如果是角色异常
NotRoleException ee = (NotRoleException) e;
msg = "无此角色:" + ee.getRole