鍍金池/ 問答/Java/ SpringBoot中如何處理Controller之前的異常

SpringBoot中如何處理Controller之前的異常

項(xiàng)目中使用了shiro做權(quán)限控制,在controller上注解了@RequiresPermissions,當(dāng)沒有權(quán)限時(shí),會(huì)拋出異常,但是這個(gè)異常是在攔截器中拋出的,spring boot的ControllerAdvisor無法捕捉到。

請教下,如何進(jìn)行處理?

回答
編輯回答
吢丕

最后,是通過增加了一個(gè)HandlerInterceptor,這個(gè)方法可行,但是處理異常的地方就變成了兩處,另一個(gè)是controller層異常的統(tǒng)一處理,總覺得不是太好的方案。

@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();
    }

}

}

2017年8月19日 16:48
編輯回答
疚幼

沒大明白你確切想做什么,如果你是想要一個(gè)統(tǒng)一的異常捕捉類的話,我可以給你提供一個(gè)思路。Spring可以通過注解和xml方式達(dá)到這樣的效果。看你的風(fēng)格應(yīng)該是注解比較習(xí)慣的,那我講講簡單的Ex 拋出處理,首先創(chuàng)建一個(gè)MyExceptionAdviceHandler類,加上@ControllerAdvice注解,該注解是控制器的一個(gè)增強(qiáng),作用于所有RequestMapping注解上(沒有指定特定包的情況下),然后聲明一個(gè)processException的方法,攜帶有一個(gè)Exception的參數(shù)ex,該方法需要對控制器的異常捕捉因此需要@ExceptionHandler,同時(shí)我建議再加上一個(gè)@ResponseBody注解,可以友好一點(diǎn)。然后聲明一個(gè)ApiResponse對象并把ex異常注入其中然后返回,這樣一個(gè)通用捕捉類就寫好了。我寫段樣例代碼吧,如果有不正的地方歡迎大牛拍磚指正。
`

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

`

2017年9月30日 09:25