概述
步骤一 : Response响应结果工具类
1. 定义基础接口:BaseResponseEntity
public interface BaseResponseEntity<T> {}
2. 定义状态信息enum类
public enum ResponseStatus {
/* 成功状态码 10000 */
SUCCESS(200, "成功"),
/* 账号错误*/
/*用户未登录*/
ACCOUNT_NOT_LOGIN(10001, "user no login"),
/*账号不存在或密码错误*/
ACCOUNT_LOGIN_ERROR(10002, "user login error"),
/*账号已存在*/
ACCOUNT_IS_EXISTENT(10003, "account is existent"),
/*账号不存在*/
ACCOUNT_NOT_EXIST(10004, "account not exist"),
/*账号已禁止 请与管理员联系*/
USER_ACCOUNT_LOCKED(10005, "user account locked"),
/* 参数错误*/
/*参数不为空*/
PARAMS_NOT_IS_BLANK(20001, "params not is blank"),
/*参数无效*/
PARAMS_IS_INVALID(20002, "params is invalid"),
/*参数类型错误*/
PARAM_TYPE_ERROR(20003, "param type error"),
/*参数缺失*/
PARAM_IS_DEFICIENCY(20004, "param is deficiency"),
/*暂无权限*/
PERMISSION_NO_ACCESS(20006, "no permissions access"),
AUTH_ERROR(20007, "auth error"),
/* 业务错误 */
/* 业务繁忙 请稍后在试 */
BUSINESS_UNKNOW_ERROR(30001, " busy with business"),
/*内部调用服务不可用*/
GW_UNKNOW_ERROR(30002, "unknow error"),
/* ======系统错误:40001-49999===== */
/* 提示语 "系统繁忙,请稍后重试"*/
SYSTEM_INNER_ERROR(40001, "system error"),
/*未知错误 请稍后在试*/
SYSTEM_UNKNOW_ERROR(40002, "system unknow error"),
/*内部系统接口调用异常*/
INNER_INVOKE_ERROR(50001, "inner invoke error"),
/*外部系统接口调用异常*/
OUTER_INVOKE_ERROR(50002, "outer invoke error"),
/*该接口禁止访问*/
NO_ACCESS_FORBIDDEN(50003, "no access forbidden"),
/*接口地址无效*/
NO_FOUND_ERROR(50004, "no found error"),
/* 数据错误 */
DATA_IS_WRONG(60001, "DATA_IS_WRONG");
private Integer status;
private String msg;
ResponseStatus(Integer status, String message) {
this.status = status;
this.msg = message;
}
public Integer getStatus() {
return status;
}
public String getMsg() {
return msg;
}
public void setStatus(Integer status) {
this.status = status;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
3. ResponseEntity类(success)
@Builder
@Data
public class ResponseEntity<Object> implements BaseResponseEntity {
private Integer status;
private String msg;
private Object data;
private ResponseEntity(ResponseStatus responseStatus, Object data) {
this.msg = responseStatus.getMsg();
this.status = responseStatus.getStatus();
this.data = data;
}
public static ResponseEntity success() {
return ResponseEntity
.builder()
.status(ResponseStatus.SUCCESS.getStatus())
.msg(ResponseStatus.SUCCESS.getMsg())
.build();
}
public static <T> ResponseEntity success(T data) {
return ResponseEntity
.builder()
.data(data)
.status(ResponseStatus.SUCCESS.getStatus())
.msg(ResponseStatus.SUCCESS.getMsg())
.build();
}
public static <T> ResponseEntity success(ResponseStatus responseStatus, T data) {
return ResponseEntity
.builder()
.data(data)
.status(responseStatus.getStatus())
.msg(responseStatus.getMsg())
.build();
}
/**
* @param status
* @param msg
* @param data
* @param <T>
* @return
*/
public static <T> ResponseEntity success(int status, String msg, T data) {
return ResponseEntity
.builder()
.data(data)
.status(status)
.msg(msg)
.build();
}
/*=============错误信息处理=================*/
/**
* 框架自带的状态码 org.springframework.http.HttpStatus
*
* @param
* @return
*/
public static ResponseEntity error() {
return ResponseEntity.builder()
.status(HttpStatus.INTERNAL_SERVER_ERROR.value())
.msg(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
.build();
}
public static ResponseEntity error(String message) {
return ResponseEntity
.builder()
.msg(message)
.build();
}
public static ResponseEntity error(int status) {
return ResponseEntity
.builder()
.status(status)
.build();
}
public static ResponseEntity error(int status, String message) {
return ResponseEntity
.builder()
.msg(message)
.status(status)
.build();
}
public static ResponseEntity error(ResponseStatus responseStatus) {
return ResponseEntity.builder()
.status(responseStatus.getStatus())
.msg(responseStatus.getMsg())
.build();
}
public static <T> ResponseEntity error(ResponseStatus responseStatus, T data) {
return ResponseEntity.builder()
.status(responseStatus.getStatus())
.msg(responseStatus.getMsg())
.data(data)
.build();
}
}
4. ErrorResponseEntity类(error)
@Data
@Builder
public class ErrorResponseEntity implements BaseResponseEntity {
/**
* HTTP响应状态码 {@link org.springframework.http.HttpStatus}
*/
private Integer status;
/**
* 前端显示的信息
*/
private String msg;
/**
* 错误的信息
*/
private String error;
/**
* 异常的名字
*/
private String exception;
private String path;
/**
* 时间戳
*/
private Date timestamp;
public static ErrorResponseEntity failure(ResponseStatus responseStatus, Throwable e) {
return ErrorResponseEntity.builder()
.msg(responseStatus.getMsg())
.status(responseStatus.getStatus())
.error(e.getMessage())
.timestamp(new Date())
.exception(e.getClass().getName())
.build();
}
}
5. 全局异常处理类(示例)
@RestControllerAdvice
@Slf4j
public class ExceptionHandlerAdvice {
/**
* 处理未捕获的Exception
* @param e 异常
* @return 统一响应体
*/
@ExceptionHandler(Exception.class)
public BaseResponseEntity handleException(Exception e) {
if (e instanceof ServiceException) {
return ResponseEntity.error(ResponseStatus.BUSINESS_UNKNOW_ERROR);
} else if (e instanceof NoHandlerFoundException) {
return ResponseEntity.error(ResponseStatus.NO_FOUND_ERROR);
} else {
return ResponseEntity.error(ResponseStatus.SYSTEM_UNKNOW_ERROR);
}
}
}
6. 全局结果处理
@RestControllerAdvice
public class GlobalResultAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
//如果返回false,将不会执行beforeBodyWrite方法
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if(body instanceof SuccessResult || body instanceof ErrorResult){
return body;
}else {
return SuccessResult.success(body);
}
}
}