一、定义错误状态枚举类
/**
* @author beth
* @data 2019-11-01 20:31
*/
public interface IErrorCode {
default Integer getCode() {
return Integer.valueOf(0);
}
default String getMsg() {
return "";
}
}
/**
* @author beth
* @data 2019-11-01 18:15
*/
@Getter
public enum ErrorCodeEnum implements IErrorCode {
UN_KNOWN(-10000, "未知错误"),
SUCCESS(0, "请求成功"),
BAD_REQUEST(400, "参数错误"),
UNAUTHORIZED(401, "未经授权"),
FORBIDDEN(403, "没有权限"),
NOT_FOUND(404, "请求的资源不存在"),
METHOD_NOT_ALLOWED(405, "请求方式不支持"),
INTERNAL_SERVER_ERROR(500, "系统繁忙"),
SERVICE_UNAVAILABLE(503, "服务不可用"),
/** 自定义异常之返回值为空 */
NullResponseException(5002, "返回空值"),
;
/**
* 状态枚举
*
* @param code 状态码
* @param msg 提示信息
*/
private ErrorCodeEnum(final Integer code, final String msg) {
this.code = code;
this.msg = msg;
}
private final Integer code;
private final String msg;
/**
* 根据 code 获取对应错误枚举
*
* @param code
* @return
*/
public static ErrorCodeEnum valueOf(Integer code) {
ErrorCodeEnum[] enums = ErrorCodeEnum.values();
for(ErrorCodeEnum errorCodeEnum : enums) {
if(errorCodeEnum.getCode().equals(code)) {
return errorCodeEnum;
}
}
return ErrorCodeEnum.UN_KNOWN;
}
/**
* 返回状态码的字符串形式
*
* @return
*/
@Override
public String toString() {
return String.format(" ErrorCode:{code=%s, msg=%s} ", code, msg);
}
}
二、封装返回数据
/**
* 统一定义返回类
* @author beth
* @data 2019-11-01 11:18
*/
@Data
public class ReturnVO {
/**
* 返回代码
*/
private Integer code;
/**
* 返回信息
*/
private String message;
/**
* 返回数据
*/
private Object data;
/**
* 默认构造,返回操作正确的返回代码和信息
*/
public ReturnVO() {
this.setCode(ErrorCodeEnum.SUCCESS.getCode());
this.setMessage(ErrorCodeEnum.SUCCESS.getMsg());
}
/**
* 构造一个返回特定代码的ReturnVO对象
* @param errorCodeEnum
*/
public ReturnVO(ErrorCodeEnum errorCodeEnum) {
this.setCode(errorCodeEnum.getCode());
this.setMessage(errorCodeEnum.getMsg());
}
/**
* 默认值返回,默认返回正确的code和message
* @param data
*/
public ReturnVO(Object data) {
this.setCode(ErrorCodeEnum.SUCCESS.getCode());
this.setMessage(ErrorCodeEnum.SUCCESS.getMsg());
this.setData(data);
}
/**
* 构造返回代码,以及自定义的错误信息
* @param code
* @param message
*/
public ReturnVO(Integer code, String message) {
this.setCode(code);
this.setMessage(message);
}
/**
* 构造自定义的code,message,以及data
* @param code
* @param message
* @param data
*/
public ReturnVO(Integer code, String message, Object data) {
this.setCode(code);
this.setMessage(message);
this.setData(data);
}
@Override
public String toString() {
return "ReturnVO{" +
"code='" + code + '\'' +
", message='" + message + '\'' +
", data=" + data +
'}';
}
}
三、使用前一步封装的类返回数据
/**
* 新增
*/
@ApiOperation(value = "新增数据")
@RequestMapping(value = "/add", method = RequestMethod.POST)
public ReturnVO add(@RequestBody UserInfo entity){
int result = iUserInfoService.insert(entity);
if(result>0){
return new ReturnVO();
}
return new ReturnVO(ErrorCodeEnum.INTERNAL_SERVER_ERROR);
}
四、前端返回结果
五、统一封装返回值和异常处理
/**
* 统一封装返回值和异常处理
* @author beth
* @data 2019-11-01 23:11
*/
@Slf4j
@Aspect
@Order(5)
@Component
public class ResponseAop {
/**
* 切点
*/
@Pointcut("execution(public * com.xiao.permission_system.controller..*(..))")
public void httpResponse() {
}
/**
* 环切
*/
@Around("httpResponse()")
public ReturnVO handlerController(ProceedingJoinPoint proceedingJoinPoint) {
ReturnVO returnVO = new ReturnVO();
try {
//获取方法的执行结果
Object proceed = proceedingJoinPoint.proceed();
//如果方法的执行结果是ReturnVO,则将该对象直接返回
if (proceed instanceof ReturnVO) {
returnVO = (ReturnVO) proceed;
} else {
//否则,就要封装到ReturnVO的data中
returnVO.setData(proceed);
}
} catch (Throwable throwable) {
//如果出现了异常,调用异常处理方法将错误信息封装到ReturnVO中并返回
returnVO = handlerException(throwable);
}
return returnVO;
}
/**
* 异常处理
*/
private ReturnVO handlerException(Throwable throwable) {
ReturnVO returnVO = new ReturnVO();
//这里需要注意,返回枚举类中的枚举在写的时候应该和异常的名称相对应,以便动态的获取异常代码和异常信息
//获取异常名称的方法
String errorName = throwable.toString();
int code = errorName.lastIndexOf(".") + 1;
//直接获取properties文件中的内容
returnVO.setMessage(ErrorCodeEnum.valueOf(code).getMsg());
returnVO.setCode(code);
return returnVO;
}
}