SpringBoot全局统一异常处理和参数返回
先编写一个枚举
public enum ResultEnum {
// 数据操作错误定义
SUCCESS(0, "成功!"),
//参数错误 1001-1999
PARAM_IS_INVALID(1001,"参数无效"),
PARAM_IS_BLANK(1002,"参数为空"),
PARAM_TYPE_BIND_ERROR(1003,"参数类型错误"),
PARAM_NOT_COMPLETE(1004,"参数缺失"),
//用户错误 2001-2999
USER_NOT_LOGGED_IN(2001,"用户未登录,访问路径需要验证,请登录"),
USER_LOGIN_ERROR(2002,"用户用户不存在或密码错误"),
USER_ACCOUNT_FORBIDDEN(2003,"账号已被禁用"),
USER_NOT_EXIST(2004,"用户不存在"),
USER_HAS_EXISTED(2005,"用户已存在"),
BODY_NOT_MATCH(400,"请求的数据格式不符!"),
SIGNATURE_NOT_MATCH(401,"请求的数字签名不匹配!"),
NOT_FOUND(404, "未找到该资源!"),
INTERNAL_SERVER_ERROR(500, "服务器内部错误!"),
SERVER_BUSY(503,"服务器正忙,请稍后再试!")
;
/** 错误码 */
private int resultCode;
/** 错误描述 */
private String resultMsg;
ResultEnum(Integer resultCode, String resultMsg) {
this.resultCode = resultCode;
this.resultMsg = resultMsg;
}
public int getResultCode() {
return resultCode;
}
public String getResultMsg() {
return resultMsg;
}
}
接下来编写一个统一响应类
public class Result implements Serializable {
/**
* 响应代码
*/
private int code;
/**
* 响应消息
*/
private String message;
/**
* 响应结果
*/
private Object data;
public Result(Integer code,String message) {
this.code = code;
this.message = message;
}
public Result(Integer code,String message,Object data) {
this.code = code;
this.message = message;
this.data=data;
}
public Result(ResultEnum resultEnum) {
this.code = resultEnum.getResultCode();
this.message = resultEnum.getResultMsg();
}
public Result(ResultEnum resultEnum, Object data) {
this.code = resultEnum.getResultCode();
this.message = resultEnum.getResultMsg();
this.data = data;
}
public static Result success(){
return new Result(ResultEnum.SUCCESS);
}
public static Result success(Object data){
return new Result(ResultEnum.SUCCESS,data);
}
public static Result failure(ResultEnum resultEnum){
return new Result(resultEnum);
}
public static Result failure(ResultEnum resultEnum,Object data){
return new Result(resultEnum,data);
}
public static Result failure(Integer code,String message){
return new Result(code,message);
}
public static Result failure(Integer code,String message,Object data){
return new Result(code,message,data);
}
public int getCode() {
return code;
}
public void setCode(ResultEnum resultEnum) {
this.code = resultEnum.getResultCode();
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
测试统一响应:
@GetMapping("/get")
public Result test(@RequestParam("name") String name){
return Result.success(name);
}
@GetMapping("/post")
public Result post(){
return Result.failure(ResultEnum.SERVER_BUSY);
}
接下来编写统一异常处理:
先编写一个自定义业务异常处理类
public class MyException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 错误码
*/
protected int errorCode;
/**
* 错误信息
*/
protected String errorMsg;
public MyException() {
super();
}
public MyException(ResultEnum resultEnum) {
super(String.valueOf(resultEnum.getResultCode()));
this.errorCode = resultEnum.getResultCode();
this.errorMsg = resultEnum.getResultMsg();
}
public MyException(ResultEnum resultEnum, Throwable cause) {
super(String.valueOf(resultEnum.getResultCode()), cause);
this.errorCode = resultEnum.getResultCode();
this.errorMsg = resultEnum.getResultMsg();
}
public MyException(String errorMsg) {
super(errorMsg);
this.errorMsg = errorMsg;
}
public MyException(Integer errorCode, String errorMsg) {
super(errorCode.toString());
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public MyException(Integer errorCode, String errorMsg, Throwable cause) {
super(errorCode.toString(), cause);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public String getErrorCode() {
return String.valueOf(errorCode);
}
public void setErrorCode(String errorCode) {
this.errorCode = Integer.valueOf(errorCode);
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public String getMessage() {
return errorMsg;
}
@Override
public Throwable fillInStackTrace() {
return this;
}
}
编写一个全局异常处理类
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理自定义的业务异常
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = MyException.class)
@ResponseBody
public Result serviceExceptionHandler(HttpServletRequest req, MyException e) {
log.error("发生业务异常!原因是:{}", e.getErrorMsg());
return Result.failure(Integer.valueOf(e.getErrorCode()), e.getErrorMsg());
}
/**
* 处理空指针的异常
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = NullPointerException.class)
@ResponseBody
public Result exceptionHandler(HttpServletRequest req, NullPointerException e) {
log.error("发生空指针异常!原因是:", e);
return Result.failure(ResultEnum.BODY_NOT_MATCH);
}
/**
* 处理其他异常
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result exceptionHandler(HttpServletRequest req, Exception e) {
log.error("未知异常!原因是:", e);
return Result.failure(ResultEnum.INTERNAL_SERVER_ERROR);
}
}
OK!
测试:
@GetMapping("/post")
public Result post(){
throw new MyException(ResultEnum.INTERNAL_SERVER_ERROR);
}