这篇文章我们介绍下再Springboot中,定义全局异常的返回的工具类信息。这里主要是涉及到3个类,下面分别介绍下:
一、定义一个ErrorCode的枚举类
所有的异常都需要进行统一定义管理,一般我们使用枚举类,所以这里我们定义ErroCode的枚举类案例如下:
import lombok.AllArgsConstructor; import lombok.Getter; /** * 错误编码 * */ @Getter @AllArgsConstructor public enum ErrorCode { UNAUTHORIZED(401, "还未授权,不能访问"), FORBIDDEN(403, "没有权限,禁止访问"), INTERNAL_SERVER_ERROR(500, "服务器异常,请稍后再试"), ACCOUNT_PASSWORD_ERROR(1001, "账号或密码错误"); private final int code; private final String msg; }
二、定义一个自定义异常
自定义一个异常,在业务模块里面,适当的时机抛出适当的异常。
import lombok.Data; import lombok.EqualsAndHashCode; /** * 自定义异常 * */ @Data @EqualsAndHashCode(callSuper = true) public class ServerException extends RuntimeException { private static final long serialVersionUID = 1L; private int code; private String msg; public ServerException(String msg) { super(msg); this.code = ErrorCode.INTERNAL_SERVER_ERROR.getCode(); this.msg = msg; } public ServerException(ErrorCode errorCode) { super(errorCode.getMsg()); this.code = errorCode.getCode(); this.msg = errorCode.getMsg(); } public ServerException(String msg, Throwable e) { super(msg, e); this.code = ErrorCode.INTERNAL_SERVER_ERROR.getCode(); this.msg = msg; } }
三、编写全局异常处理
前面的工作都做完了,这里的话就直接做全局异常的处理,代码如下:
import lombok.extern.slf4j.Slf4j; import net.srt.framework.common.utils.Result; import org.springframework.security.access.AccessDeniedException; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 异常处理器 */ @Slf4j @RestControllerAdvice public class ServerExceptionHandler { /** * 处理自定义异常 */ @ExceptionHandler(ServerException.class) public Result<String> handleException(ServerException ex) { return Result.error(ex.getCode(), ex.getMsg()); } /** * SpringMVC参数绑定,Validator校验不正确 */ @ExceptionHandler(BindException.class) public Result<String> bindException(BindException ex) { FieldError fieldError = ex.getFieldError(); assert fieldError != null; return Result.error(fieldError.getDefaultMessage()); } @ExceptionHandler(AccessDeniedException.class) public Result<String> handleAccessDeniedException(Exception ex) { return Result.error(ErrorCode.FORBIDDEN); } @ExceptionHandler(Exception.class) public Result<String> handleException(Exception ex) { log.error(ex.getMessage(), ex); return Result.error("出错了!异常信息:" + ex.getMessage()); } }
按照这个流程及模板,我们就可以自己做全局异常了。
还没有评论,来说两句吧...