SpringBoot全局异常捕获及处理(包括自定义异常捕获处理)


  • 1、全局异常捕捉处理

@ControllerAdvice(annotations = {RestController.class})

public class ExceptionHandlerAdvice {

 

private static final Logger LOGGER = LoggerFactory.getLogger(this.getCLass());

 

@ExceptionHandler(EntityTransException.class)

public ResponseResult entityTransExceptionHandle(HttpServletRequest request,EntityTransException e){

LOGGER.error("********************Throw EntityTransException.url:{} ERROR:{}********************",request.getRequestURL(), e.getMessage(), e);

ResponseResult result = new ResponseResult();

result.setSuccess(false);

result.setMessage(ResultCode.ERROR_ENTITY_TRANS.getMessage() + "。异常原因:" + e.getMessage());

result.setCode(ResultCode.ERROR_ENTITY_TRANS.getCode());

return result;

}

@ExceptionHandler(SqlException.class)

public ResponseResult sqlExceptionHandle(HttpServletRequest request,SqlException e){

LOGGER.error("********************Throw SqlException.url:{} ERROR:{}********************",request.getRequestURL(), e.getMessage(), e);

ResponseResult result = new ResponseResult();

result.setSuccess(false);

result.setMessage(ResultCode.ERROR_SQL_CHECK.getMessage() + "。异常原因:" + e.getMessage());

result.setCode(ResultCode.ERROR_SQL_CHECK.getCode());

return result;

}

@ExceptionHandler(Exception.class)

public ResponseResult exceptionHandle(HttpServletRequest request,Exception e){

LOGGER.error("********************Throw Exception.url:{} ERROR:{}********************",request.getRequestURL(), e.getMessage(), e);

ResponseResult result = new ResponseResult();

result.setSuccess(false);

result.setMessage(ResultCode.ERROR.getMessage());

result.setCode(ResultCode.ERROR.getCode());

return result;

}

}

  • 2、自定义异常类

package com.czgo.exception;

/**
* 自定义异常类(继承运行时异常)
* @author zhangzhixiang
* @version 2018/11/09
*/
public class SqlException extends RuntimeException {


private static final long serialVersionUID = 1L;

/**
* 错误编码
*/
private String errorCode;

/**
* 消息是否为属性文件中的Key
*/
private boolean propertiesKey = true;

/**
* 构造一个基本异常.
*
* @param cause 异常信息
*
*/
public SqlException(Throwable cause){

super(cause);

}

/**
* 构造一个基本异常.
*
* @param message 信息描述
*
*/
public SqlException(String message){

super(message);

}

/**
* 构造一个基本异常.
*
* @param errorCode 错误编码
* @param message 信息描述
*
*/
public SqlException(String errorCode, String message){

this(errorCode, message, true);

}

/**
* 构造一个基本异常.
*
* @param errorCode 错误编码
* @param message
*
*/
public SqlException(String errorCode, String message, Throwable cause){

this(errorCode, message, cause, true);

}

/**
* 构造一个基本异常.
*
* @param errorCode 错误编码
* @param message 信息描述
* @param propertiesKey 消息是否为属性文件中的Key
*
*/
public SqlException(String errorCode, String message, boolean propertiesKey){

super(message);

this.setErrorCode(errorCode);

this.setPropertiesKey(propertiesKey);

}

/**
* 构造一个基本异常.
*
* @param errorCode 错误编码
* @param message 信息描述
*
*/
public SqlException(String errorCode, String message, Throwable cause, boolean propertiesKey){

super(message, cause);

this.setErrorCode(errorCode);

this.setPropertiesKey(propertiesKey);

}

/**
* 构造一个基本异常.
*
* @param message 信息描述
* @param cause 根异常类(可以存入任何异常)
*
*/
public SqlException(String message, Throwable cause){

super(message, cause);

}


public String getErrorCode(){

return errorCode;

}

public void setErrorCode(String errorCode){

this.errorCode = errorCode;

}

public boolean isPropertiesKey(){

return propertiesKey;

}

public void setPropertiesKey(boolean propertiesKey){

this.propertiesKey = propertiesKey;

}

}

  • 3、Controller层

@RestController

@RequestMapping("/user")

public class FileController extends ExceptionHandlerAdvice {


private final Logger logger = LoggerFactory.getLogger(this.getClass());


@RequestMapping(value = "/selectByCondition", method = RequestMethod.POST)

public ResponseResult selectByCondition() throws Exception {

throw new EntityTransException("这是一个自定义实体转换异常,这条异常会在ExceptionHandlerAdvice的entityTransExceptionHandle方法中被拦截");

}

@RequestMapping(value = "/update", method = RequestMethod.POST)

public ResponseResult update() throws Exception {

throw new SqlException("这是一个自定义SQL异常,这条异常会在ExceptionHandlerAdvice的sqlExceptionHandle方法中被拦截");

}

}

  • 4、封装返回实体

public class ResponseResult implements Serializable {

private static final long serialVersionUID = 6054052582421291408L;


private String message;

private Object data;

private int code;

private boolean success;

private Long total;


public ResponseResult(){}


public ResponseResult(boolean success, Object data) {

this.success = success;

this.data = data;

}

public ResponseResult(boolean success, String message, Object data) {

this.success = success;

this.message = message;

this.data = data;

}

public String getMessage() {

return message;

}

public ResponseResult setMessage(String message) {

this.message = message;

return this;

}

public Object getData() {

return data;

}

public ResponseResult setData(Object data) {

this.data = data;

return this;

}

public boolean getSuccess() {

return success;

}

public ResponseResult setSuccess(boolean success) {

this.success = success;

return this;

}

public int getCode() {

return code;

}

public ResponseResult setCode(int code) {

this.code = code;

return this;

}

public Long getTotal() {

return success;

}

public ResponseResult setTotal(Long total) {

this.total = total;

return this;

}

}

  • 5、补充

@ControllerAdvice(annotations = {RestController.class})

public class ExceptionHandlerAdvice {


private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionHandlerAdvice.class);


/**
* 400错误
*
* @param e
* @return java.lang.ResponseResult
* @author zxzhang
* @date 2019/6/27
*/
@ExceptionHandler({HttpMessageNotReadableException.class, TypeMismatchException.class, MissingServletRequestParameterException.class})

public ResponseResult requestNotReadable(HttpServletRequest request, HttpMessageNotReadableException e) {

return resultFormat(request, ResponseEnum.RESPONSE_CODE_PARAM_ERR, e);

}


/**
* 404错误
*
* @param e
* @return java.lang.ResponseResult
* @author zxzhang
* @date 2019/6/27
*/
@ExceptionHandler({NoHandlerFoundException.class})

public ResponseResult requestNotReadable(HttpServletRequest request, NoHandlerFoundException e) {

return resultFormat(request, ResponseEnum.RESPONSE_CODE_NOT_FOUND, e);

}


/**
* 405错误
*
* @param e
* @return java.lang.ResponseResult
* @author zxzhang
* @date 2019/6/27
*/
@ExceptionHandler({HttpRequestMethodNotSupportedException.class})

public ResponseResult request405(HttpServletRequest request, HttpRequestMethodNotSupportedException e) {

return resultFormat(request, ResponseEnum.RESPONSE_CODE_METHOD_NOT_SUPPORT, e);

}


/**
* 406错误
*
* @param e
* @return java.lang.ResponseResult
* @author zxzhang
* @date 2019/6/27
*/
@ExceptionHandler({HttpMediaTypeNotAcceptableException.class})

public ResponseResult request406(HttpServletRequest request, HttpMediaTypeNotAcceptableException e) {

return resultFormat(request, ResponseEnum.RESPONSE_CODE_TYPE_NOT_ACCEPTABLE, e);

}

/**
* Throwable拦截器
*
* @param request
* @param e
* @return com.openailab.oascloud.common.model.ResponseResult
* @author zxzhang
* @date 2019/6/27
*/
@ExceptionHandler(Throwable.class)

public ResponseResult exceptionHandle(HttpServletRequest request, Throwable e) {

return resultFormat(request, ResponseEnum.RESPONSE_CODE_FAIL, e);

}

/**
* 格式封装
*
* @param request
* @param responseEnum
* @param e
* @return com.openailab.oascloud.common.model.ResponseResult
* @author zxzhang
* @date 2019/6/27
*/
private ResponseResult resultFormat(HttpServletRequest request, ResponseEnum responseEnum, Throwable e) {

LOGGER.error("********************Throw Exception.url:{} ERROR:{}********************", request.getRequestURL(), e.getMessage(), e);

ResponseResult result = new ResponseResult();

result.setstatus(CommonConst.RESPONSE_FAIL);

result.setMessage(responseEnum.getMsg());

result.setCode(responseEnum.getCode());

return result;

}

}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM