Spring controller層異常的統一處理

一、Spring controller層異常的統一處理

該方法是在 http://www.javashuo.com/article/p-hahliwfu-kp.html 上的某一方面擴展,使其在異常(包括RuntimeException和各類自定義異常)的抓取與前端顯示上的統一。前端

1.1 spring-mvc.xml:配置xml

此處class爲該ExceptionAspect.java的路徑java

<!-- 異常捕獲aop -->
	<bean id="exceptionHandler" class="*.*.ExceptionAspect" />

1.2 ExceptionAspect.java

這裏取了個巧:Pointcut切點選擇了全部被@RequestMapping註解修飾的方法,按照代碼規範,全部被註解修飾的方法均在controller裏。web

利用aop的around(環繞),對異常進行抓取並進行相應的處理ajax

同時判斷其是否爲ajax請求,同時可根據抓取的異常裏的e.getMessage()來接收自定義異常的報錯內容,使其交互更符合實際需求。spring

/**
 * @Description: 切面:統一的異常處理
 */

@Aspect
@Component
public class ExceptionAspect  extends BaseAction {

    @Autowired
    private HttpServletRequest request;
    
    //日誌相關的service層,將相關數據以日誌形式保存下來
    @Resource
    private SysLogService sysLogService;

    // Controller層切點
    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    
    //@annotation用於匹配當前執行方法持有指定註解的方法;
    public void exceptionAspect() {
    }

    @Around("exceptionAspect()")
    public Object around(ProceedingJoinPoint joinPoint){
        Object object = null;
        Result result = new Result();
        try {
            object = joinPoint.proceed();
            return object;
        } catch (Exception e) {
            e.printStackTrace();
            String message = e.getMessage();
            if(StringUtils.isNotBlank(message)){
                if(message.length() > 100){
                    message = message.substring(0,100);
                }
                result.setMsg(message);
            }else {
                result.setMsg("" + e.getClass());
            }
            sysLogService.saveByJoinPoint(joinPoint,SecurityConstants.OPER_LOG_STATUS.OPER_LOG_STATUS_FAIL_4ENUM.getValue(),result.getMsg());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        //request.getHeader("x-requested-with")爲 null,則爲傳統同步請求,爲 XMLHttpRequest,則爲 Ajax 異步請求。
        if("XMLHttpRequest".equals(request.getHeader("x-requested-with"))){
            return result;//是ajax請求
        } else {
            Map<String,Object> context = new HashMap<String,Object>();
            context.put("result",result);
            JSONObject jsonObject =  coverJson("/test/common/page/error.vm",context);
            ModelAndView mav = new ModelAndView("/common/page/error");
            mav.addAllObjects(jsonObject);
            return mav;
        }
    }
}

1.3 實際效果

全部被@RequestMapping註解修飾的方法(按照代碼規範,均在controller層中),一旦拋出異常,均會被該ExceptionAspect.java抓取到。若異常已被方法自身try catch到,則不會被抓取。同時可將Exception的報錯類型和報錯信息以開發者須要的形式或保存到日誌中,或展現在前端頁面上。json

相關文章
相關標籤/搜索