1.创建一个业务异常处理类
/**
* 服务(业务)异常如“ 账号或密码错误 ”,该异常只做INFO级别的日志记录 @see WebMvcConfigurer
*/
public class ServiceException extends RuntimeException {
private Code code;
public ServiceException(Code code) {
super(code.getMessage());
this.code = code;
}
public ServiceException(Code code, String message) {
super(message);
this.code = code;
this.code.setMessage(message);
}
public ServiceException(Code code, Throwable cause) {
super(cause);
this.code = code;
}
/**
* 获取业务错误代码
*
* @return 业务错误代码
*/
public Code getCode() {
return code;
}
}
2,定义全局异常拦截和处理类
/**
* 全局异常处理
*
* Created by huhu
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 处理业务异常
*
* @param request
* @param ex
* @return
*/
@ExceptionHandler(ServiceException.class)
public Result handleServiceException(HttpServletRequest request, ServiceException ex) {
logger.info("service exception : {}", ex.getMessage());
return ResultGenerator.genFailResult(ex.getCode(), ex.getMessage(), "");
}
/**
* 处理文件上传异常
*
* @param request
* @param e
* @return
*/
@ExceptionHandler(MultipartException.class)
public Result handleMultipartException(HttpServletRequest request, MultipartException e) {
if (e.getMessage().contains("the request was rejected because its size")) {
logger.info("upload file error : {}", e.getMessage());
return ResultGenerator.genFailResult(CommonCode.UPLOAD_FILE_ERROR);
}
logger.info("upload file error : {}", e.getMessage());
return ResultGenerator.genFailResult(CommonCode.UPLOAD_FILE_ERROR);
}
/**
* 捕获和处理 MethodArgumentNotValidException 方法参数无效的异常信息
*
* @param request 请求
* @param e 异常
* @return 返回异常信息状态码和异常信息
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleBindException(HttpServletRequest request, MethodArgumentNotValidException e) {
logger.info("method argument not valid exception : ", e.getMessage());
Map<String, String> data = e.getBindingResult().getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
return ResultGenerator.genFailResult(CommonCode.PARAMETER_ERROR, data);
}
/**
* 处理 Exception 异常
*
* @param request
* @param ex
* @return
*/
@ExceptionHandler(Exception.class)
public Result handleException(HttpServletRequest request, Exception ex) {
ex.printStackTrace();
handleLog(request, ex);
String nowMessage = "Request method '" + request.getMethod() + "' not supported";
if (ex.getMessage().equals(nowMessage)){
logger.info("method error, please choose correct method!");
return ResultGenerator.genFailResult(CommonCode.HTTP_METHOD_ERROR, ex.getMessage());
}
logger.info("server inernal error, please contact the administrator!");
return ResultGenerator.genFailResult(CommonCode.SERVER_INERNAL_ERROR, ex.getMessage());
}
/**
* 处理日志
*
* @param request
* @param ex
*/
private void handleLog(HttpServletRequest request, Exception ex) {
StringBuffer logBuffer = new StringBuffer();
logger.error(ex.getMessage());
if (request != null) {
logBuffer.append(" request method=" + request.getMethod());
logBuffer.append(" url=" + request.getRequestURL());
logBuffer.append(" params=" + request.getParameterMap());
}
if (ex != null) {
logBuffer.append(" exception:" + ex);
}
logger.error(logBuffer.toString());
}
}
全局异常处理主要是@RestControllerAdvice 注解和@ExceptionHandler(ServiceException.class)组合使用的结果,关于这两个注解可以百度一下。