在整个系统中,通常会要求有统一性的异常抛出,统一的异常格式,统一的异常界面,而不是把整个堆栈错误信息抛出,这样对整个系统的安全性以及错误定位都非常不好,接下来我们紧接上一章的源码,加上统一异常。
1.创建全局异常处理类
注解@ControllerAdvice表示这是一个控制器增强类,当控制器发生异常且符合类中定义的拦截异常类,将会被拦截,现在我们定义一个名为CommException的统一异常类和一个CommExceptionHandler 的异常处理类
package com.example.firstweb.exception;import com.example.firstweb.util.Constants;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice
public class CommExceptionHandler {@ExceptionHandler(value = CommException.class)@ResponseBodypublic ErrorData errorHandler(CommException ex){Constants.LOG_ACCESS_INFO.error("");ErrorData errors=new ErrorData();errors.setErrCode(ex.getErrorCode());errors.setErrMsg(ex.getMsg());return errors;}}
package com.example.firstweb.exception;public class CommException extends RuntimeException {/****/private static final long serialVersionUID = 7792336437477580246L;/* 异常码 */private int errorCode;/* 异常描述 */private String msg;public CommException(String msg) {super();this.msg = msg;}public CommException(Integer code, String msg){super(msg);this.errorCode = code;this.msg = msg;}public int getErrorCode() {return errorCode;}public void setErrorCode(int errorCode) {this.errorCode = errorCode;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}
2.增加统一异常返回结果类
有了上面的两个类后,我们就要返回统一的结果给界面了,可以是JSON格式的字符串,也可以是一个完美的统一出错界面视图。这里我们用的是统一json报错
package com.example.firstweb.exception;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;@JsonInclude(JsonInclude.Include.NON_EMPTY) // 空值不序列化2.x
public class ErrorData {// 错误返回@JsonProperty(value = "err_code")private Integer errCode;@JsonProperty(value = "err_msg")private String 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;}}
接下来,我们建立一个测试的controller来抛出这个CommException 异常
package com.example.firstweb.controller;import com.example.firstweb.exception.CommException;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestExceptionController {@GetMapping("/commExcetion")public CommException commExcetion(){throw new CommException(111,"comm exceptiong");}
}
接下来,我们把整个工程运行起来。直接访问http://localhost:8088/commExcetion,返回下面的一个统一的JSON报错
源代码可以在这里获得链接: https://pan.baidu.com/s/1oNRHU6E1PxFvD-af27OU3g 提取码: 8wwq