前言
本篇文章讲的是配置全局异常,其实就是一个注解就能搞定的事,但是与之配套的还有自定义异常和返回结果封装类,能让代码或错误信息更规整,易查看
1.返回结果类
代码如下(示例):
@Data
@JsonInclude(Include.NON_EMPTY)
public class ResponseResult<T> {
// 返回请求是否成功
private boolean success;
private String errorCode;
private String errorMessage;
// 成功时的返回数据
private T data;
private ResponseResult() {
}
protected ResponseResult(boolean success, String errorCode, String errorMessage, T data) {
this.success = success;
this.errorCode = errorCode;
this.errorMessage = errorMessage;
this.data = data;
}
public static <T> ResponseResult<T> success() {
return new ResponseResult<>(true, null,null, null);
}
public static <T> ResponseResult<T> success(T data) {
return new ResponseResult<>(true, null, null, data);
}
public static <T> ResponseResult<T> failed() {
return new ResponseResult<>(false, null,null, null);
}
public static <T> ResponseResult<T> failed(String errorCode, String errorMessage) {
return new ResponseResult<>(false, errorCode, errorMessage,null);
}
}
2.自定义异常类
代码如下(示例):
@Getter
public class GeneralException extends RuntimeException {
private static final long serialVersionUID = 5816061234716876723L;
protected final ErrorCode errorCode;
protected final String errorMessage;
public GeneralException(ErrorCode errorCode) {
this.errorCode = errorCode;
this.errorMessage = errorCode.getMessage();
}
public GeneralException(ErrorCode errorCode, String errorMessage) {
super(errorMessage);
this.errorCode = errorCode;
this.errorMessage = errorMessage;
}
}
3.异常code枚举
代码如下(示例):
public enum ErrorCode {
INVALID_REQUEST("E10001", "Bad request."),
NOT_FOUND("E10003", "Target data not Found."),
SYSTEM_ERROR("E10004", "System Error."),
INVALID_ACCESS_TOKEN("E10006", "Invalid access token."),
INVALID_REFRESH_TOKEN("E10007", "Invalid refresh token.");
private final String code;
private final String message;
ErrorCode(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
}
4.全局异常类
代码如下(示例):
// 能够拦截所有接口
@RestControllerAdvice
public class GlobalExceptionHandler {
// 自定义的异常
@ExceptionHandler(GeneralException.class)
public ResponseResult handleException(GeneralException e) {
return ResponseResult.failed(e.getErrorCode());
}
// 校验参数@NotEmpty,@NotBlank当参数为null或""时会抛这个异常
@ExceptionHandler({MethodArgumentNotValidException.class})
public ResponseResult handleValidationException(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getFieldErrors().stream().map(fieldError ->
fieldError.getField() + ":" + fieldError.getDefaultMessage()).collect(Collectors.joining(","));
return ResponseResult.failed(ErrorCode.INVALID_REQUEST.getCode(), message);
}
@ExceptionHandler(Exception.class)
public ResponseResult handleException(Exception e) {
return ResponseResult.failed(ErrorCode.SYSTEM_ERROR.getCode(), ErrorCode.SYSTEM_ERROR.getMessage());
}
}