我是靠谱客的博主 真实大象,最近开发中收集的这篇文章主要介绍基于Spring AOP实现通用异常拦截器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

通常在项目里,会用大catch包住异常,但是这么做在生产上将影响问题定位;为了在项目中更规范的进行编码,本文将详细介绍如何基于AOP来实现异常拦截
处理结果:

404请求异常
在这里插入图片描述
请求参数异常
在这里插入图片描述

一、开启AspectJ的Proxy设置,使得SpringBoot容器可以解析aop配置

@EnableAspectJAutoProxy(proxyTargetClass = true)
在这里插入图片描述

二、定义通用返回逻辑

2.1 通用返回类 CommonRes.class

package com.yfy.dianping.common;
/**
* @author youfy
*/
public class CommonRes {
/**
*请求的返回处理结果,"success"或"fail"
*/
private String status;
/**
* 若status=success时,表明对应的返回的json类数据
* 若status=fail时,则data内将使用通用的错误码对应的格式
*/
private Object data;
/**
*定义一个通用的创建返回对象的方法
*/
public static CommonRes create(Object result){
return CommonRes.create(result,"success");
}
public static CommonRes create(Object result,String status){
CommonRes commonRes = new CommonRes();
commonRes.setStatus(status);
commonRes.setData(result);
return commonRes;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}

2.2 通用异常类 CommonError.class

package com.yfy.dianping.common;
/**
* @author youfy
*/
public class CommonError {
/**
* 错误码
*/
private Integer errCode;
/**
* 错误描述
*/
private String errMsg;
public CommonError(Integer errCode, String errMsg) {
this.errCode = errCode;
this.errMsg = errMsg;
}
public CommonError(EmBusinessError emBusinessError){
this.errCode = emBusinessError.getErrCode();
this.errMsg = emBusinessError.getErrMsg();
}
public Integer getErrCode() {
return errCode;
}
public void setErrCode(Integer errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
}

2.3业务异常 BusinessException.class

package com.yfy.dianping.common;
/**
* @author youfy
*/
public class BusinessException extends Exception {
private CommonError commonError;
public BusinessException(EmBusinessError emBusinessError){
super();
this.commonError = new CommonError(emBusinessError);
}
public CommonError getCommonError() {
return commonError;
}
public void setCommonError(CommonError commonError) {
this.commonError = commonError;
}
}

2.4 异常枚举 EmBusinessError.class

package com.yfy.dianping.common;
/**
* @author youfy
*/
public enum EmBusinessError {
//通用的错误类型以10000开头
NO_OBJECT_FOUND(10001, "请求对象不存在"),
UNKNOWN_ERROR(10002, "未知异常"),
NO_HANDLE_FOUND(10003, "找不到执行的路径操作"),
BIND_EXCEPTION_ERROR(10004, "请求参数错误"),
;
private Integer errCode;
private String errMsg;
EmBusinessError(Integer errCode, String errMsg) {
this.errCode = errCode;
this.errMsg = errMsg;
}
public Integer getErrCode() {
return errCode;
}
public void setErrCode(Integer errCode) {
this.errCode = errCode;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
}

三、定义全局异常处理器,使用@ControllerAdvice可覆盖所有controller

全局异常处理器 GlobalExceptionHandler.class

package com.yfy.dianping.common;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.NoHandlerFoundException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author youfy
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public CommonRes doError(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,
Exception ex) {
if (ex instanceof BusinessException) {
return CommonRes.create(((BusinessException) ex).getCommonError(), "fail");
} else if (ex instanceof NoHandlerFoundException) {
CommonError commonError = new CommonError(EmBusinessError.NO_HANDLE_FOUND);
return CommonRes.create(commonError, "fail");
} else if (ex instanceof ServletRequestBindingException) {
CommonError commonError = new CommonError(EmBusinessError.BIND_EXCEPTION_ERROR);
return CommonRes.create(commonError, "fail");
} else {
CommonError commonError = new CommonError(EmBusinessError.UNKNOWN_ERROR);
return CommonRes.create(commonError, "fail");
}
}
}

四、处理404请求异常,设置:拒绝404默认的处理,如果没找到处理器就抛出异常

application.properties下配置:

spring.resources.add-mappings=true
spring.mvc.throw-exception-if-no-handler-found=true

五、处理请求参数异常,用ServletRequestBindingException捕获

if (ex instanceof NoHandlerFoundException) {
CommonError commonError = new CommonError(EmBusinessError.NO_HANDLE_FOUND);
return CommonRes.create(commonError, "fail");
}

最后

以上就是真实大象为你收集整理的基于Spring AOP实现通用异常拦截器的全部内容,希望文章能够帮你解决基于Spring AOP实现通用异常拦截器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部