SpringBoot中如何处理Controller之前的异常

项目中使用了shiro做权限控制,在controller上注解了@RequiresPermissions,当没有权限时,会抛出异常,但是这个异常是在拦截器中抛出的,spring boot的ControllerAdvisor无法捕捉到。

请教下,如何进行处理?

阅读 5.9k
3 个回答

最后,是通过增加了一个HandlerInterceptor,这个方法可行,但是处理异常的地方就变成了两处,另一个是controller层异常的统一处理,总觉得不是太好的方案。

@Component
public class PreControllerExceptionIntercep implements HandlerInterceptor {

private static final Logger log = LoggerFactory.getLogger(PreControllerExceptionIntercep.class);
@Override
public void afterCompletion(HttpServletRequest request , HttpServletResponse response,Object handler,Exception ex) throws Exception{
    if(ex instanceof UnauthenticatedException){
        log.info("the access isn't valid");
        PackVo packVo = new PackVo();
        packVo.setSuccess(false);
        packVo.addMsg(BizExceptionCode.NO_PERMISSION_EXCEPTION,"");
        String jsonPack = JSON.toJSONString(packVo);
        response.setContentType("application/json;charset=UTF-8");
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires",0);
        PrintWriter out = response.getWriter();
        out.print(jsonPack);
        out.flush();
        out.close();
    }

}

}

没大明白你确切想做什么,如果你是想要一个统一的异常捕捉类的话,我可以给你提供一个思路。Spring可以通过注解和xml方式达到这样的效果。看你的风格应该是注解比较习惯的,那我讲讲简单的Ex 抛出处理,首先创建一个MyExceptionAdviceHandler类,加上@ControllerAdvice注解,该注解是控制器的一个增强,作用于所有RequestMapping注解上(没有指定特定包的情况下),然后声明一个processException的方法,携带有一个Exception的参数ex,该方法需要对控制器的异常捕捉因此需要@ExceptionHandler,同时我建议再加上一个@ResponseBody注解,可以友好一点。然后声明一个ApiResponse对象并把ex异常注入其中然后返回,这样一个通用捕捉类就写好了。我写段样例代码吧,如果有不正的地方欢迎大牛拍砖指正。
`

@ControllerAdivce
public class MyExceptionHandler{
    @ResponseBody
    @ExceptionHandler
    public ApiResponse processEx(Exception ex){
        ApiResponse resp = ApiResponse.responseError(ex);
        return resp;
    }
}

`

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题