结果集类
状态码类:
public enum ResponseCode {
SUCCESS(200, true),
FAILURE(500, false),
ERROR(-1, false);
@Getter
private final int code;
@Getter
private final boolean success;
ResponseCode(int code, boolean success) {
this.code = code;
this.success = success;
}
}
返回结果类:
@Data
public class Response<T> implements Serializable {
private int code;
private boolean success;
private T data;
public Response() {
}
public static <T> Response<T> success() {
return Response.success(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.isSuccess(), null);
}
public static <T> Response<T> failure() {
return Response.failure(ResponseCode.FAILURE.getCode(), ResponseCode.FAILURE.isSuccess(), null);
}
public static <T> Response<T> error() {
return Response.error(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.isSuccess(), null);
}
public static <T> Response<T> success(T data) {
return Response.success(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.isSuccess(), data);
}
public static <T> Response<T> failure(T data) {
return Response.failure(ResponseCode.FAILURE.getCode(), ResponseCode.FAILURE.isSuccess(), data);
}
public static <T> Response<T> error(T data) {
return Response.error(ResponseCode.ERROR.getCode(), ResponseCode.ERROR.isSuccess(), null);
}
public static <T> Response<T> success(int code, boolean success, T data) {
Response<T> result = new Response<T>();
result.setCode(code);
result.setSuccess(success);
result.setData(data);
return result;
}
public static <T> Response<T> failure(int code, boolean success, T data) {
Response<T> result = new Response<T>();
result.setCode(code);
result.setSuccess(success);
result.setData(data);
return result;
}
public static <T> Response<T> error(int code, boolean success, T data) {
Response<T> result = new Response<T>();
result.setCode(code);
result.setSuccess(success);
result.setData(data);
return result;
}
}
异常类
异常响应的API统一返回体
@Data
public class ErrorResult implements Serializable {
private Integer code;
private String message;
private boolean success = false;
@JsonIgnore
private ResultCode resultCode;
public static ErrorResult error() {
ErrorResult result = new ErrorResult();
result.setResultCode(ResultCode.INTERNAL_ERROR);
return result;
}
public static ErrorResult error(String message) {
ErrorResult result = new ErrorResult();
result.setCode(ResultCode.INTERNAL_ERROR.code());
result.setMessage(message);
return result;
}
public static ErrorResult error(Integer code, String message) {
ErrorResult result = new ErrorResult();
result.setCode(code);
result.setMessage(message);
return result;
}
public static ErrorResult error(ResultCode resultCode, String message) {
ErrorResult result = new ErrorResult();
result.setResultCode(resultCode);
result.setMessage(message)
return result;
}
}
自定义异常基类
@Data
public class BaseException extends RuntimeException {
private static final int BASE_EXCEPTION_CODE = ResultCode.INTERNAL_ERROR.code();
private static final String BASE_EXCEPTION_MESSAGE = ResultCode.INTERNAL_ERROR.message();
private Integer code;
private String message;
public BaseException() {
super(BASE_EXCEPTION_MESSAGE);
this.code = BASE_EXCEPTION_CODE;
this.message = BASE_EXCEPTION_MESSAGE;
}
public BaseException(String message) {
super(message);
this.code = BASE_EXCEPTION_CODE;
this.message = message;
}
public BaseException(ResultCode resultCode) {
super(resultCode.message());
this.code = resultCode.code();
this.message = resultCode.message();
}
public BaseException(Throwable cause) {
super(cause);
this.code = BASE_EXCEPTION_CODE;
this.message = BASE_EXCEPTION_MESSAGE;
}
public BaseException(String message, Throwable cause) {
super(message, cause);
this.code = BASE_EXCEPTION_CODE;
this.message = message;
}
public BaseException(Integer code, String message) {
super(message);
this.code = code;
this.message = message;
}
public BaseException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
this.message = message;
}
}
自定义业务异常类
public class BizException extends BaseException {
public BizException(ResultCode resultCode) {
super(resultCode);
}
}
全局异常处理类
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BaseException.class)
public ErrorResult baseException(BaseException e) {
if (StringUtils.isEmpty(e.getCode())) {
return ErrorResult.error(e.getMessage());
}
return ErrorResult.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(BizException.class)
public ErrorResult bizException(BizException e) {
if (StringUtils.isEmpty(e.getCode())) {
return ErrorResult.error(e.getMessage());
}
return ErrorResult.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(Exception.class)
public ErrorResult handleException(Exception e) {
log.error(e.getMessage(), e);
return ErrorResult.error(e.getMessage());
}
@ExceptionHandler(MissingServletRequestParameterException.class)
public ApiResult<String> parameterMissingExceptionHandler(MissingServletRequestParameterException e) {
log.error(e.getMessage(), e);
return ErrorResult.error(PARAMETER_EXCEPTION, "请求参数 " + e.getParameterName() + " 不能为空");
}
@ExceptionHandler(HttpMessageNotReadableException.class)
public ErrorResult parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) {
log.error(e.getMessage(), e);
return ErrorResult.error(PARAMETER_EXCEPTION, "参数体不能为空");
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ErrorResult parameterExceptionHandler(MethodArgumentNotValidException e) {
log.error(e.getMessage(), e);
BindingResult exceptions = e.getBindingResult();
if (exceptions.hasErrors()) {
List<ObjectError> errors = exceptions.getAllErrors();
if (!errors.isEmpty()) {
FieldError fieldError = (FieldError) errors.get(0);
return ErrorResult.error(PARAMETER_EXCEPTION, fieldError.getDefaultMessage());
}
}
return ErrorResult.error(PARAMETER_EXCEPTION, "请求参数校验异常");
}
}