1、定义错误状态枚举类html
/** * @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); } }
2、封装返回数据前端
/** * 统必定义返回类 * @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 + '}'; } }
3、使用前一步封装的类返回数据app
/** * 新增 */ @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); }
4、前端返回结果ide
5、统一封装返回值和异常处理this
/** * 统一封装返回值和异常处理 * @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; } }