项目场景:
统一返回对象和全局异常处理是非常基本的模块,开头先把这里写了,学习了下三更老师的相关设计,和我之前用的这两种模块结合了下。
统一返回类型
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import static com.zyq.enums.StatusCodeEnum.SUCCESS;
import static com.zyq.enums.StatusCodeEnum.FAIL;
@Data
@ApiModel(description = "结果返回类")
public class BaseResult <T> {
/**
* 状态码
*/
@ApiModelProperty(value = "状态码")
private Integer code;
/**
* 返回信息
*/
@ApiModelProperty(value = "返回信息")
private String msg;
/**
* 返回数据
*/
@ApiModelProperty(value = "返回数据")
private T data;
public static <T> BaseResult<T> success() {
return buildResult(true, null, SUCCESS.getCode(), SUCCESS.getMsg());
}
public static <T> BaseResult<T> success(T data) {
return buildResult(true, data, SUCCESS.getCode(), SUCCESS.getMsg());
}
public static <T> BaseResult<T> fail(String message) {
return buildResult(false, null, FAIL.getCode(), message);
}
public static <T> BaseResult<T> fail(Integer code, String message) {
return buildResult(false, null, code, message);
}
private static <T> BaseResult<T> buildResult(Boolean flag, T data, Integer code, String message) {
BaseResult<T> r = new BaseResult<>();
r.setData(data);
r.setCode(code);
r.setMsg(message);
return r;
}
}
VO优化:
之前我写的项目虽然也想使用VO优化,但是一直用的不太好,理解的不是很透彻,这次学习了以后,相信之后能熟练使用了。
我们在项目中一般最后还要把VO来接受查询出来的结果。一个接口对应一个VO,这样即使接口响应字段要修改也只要改VO即可。
例如:两个接口一个返回热门文章,另一个返回文章的所有类别,虽然他们的实体类都是Article,但是我们依然写两个VO,这两个VO所包含的属性依照需求来设置,这样再加上BeanCopy,当我们一个需求改变时,只需改变其对应的VO,而不用改变另一个。
全局异常处理:
之前我使用的全局异常处理和三更老师的差不多,稍加修改,完成的十分顺利,就不详细赘述了。
在开发过程中可能需要做很多的判断校验,如果出现了非法情况我们是期望响应对应的提示的。但是如果我们每次都自己手动去处理就会非常麻烦。我们可以选择直接抛出异常的方式,然后对异常进行统一处理。把异常中的信息封装成ResponseResult响应给前端。
BlogException异常类:
@Getter
public class BlogException extends RuntimeException{
private Integer code;
private String msg;
public BlogException(BlogErrorInfoEnum errorInfoEnum) {
super(errorInfoEnum.getMsg());
this.code = errorInfoEnum.getCode();
this.msg = errorInfoEnum.getMsg();
}
}
BlogErrorInfoEnum异常信息枚举类:
@Getter
public enum BlogErrorInfoEnum {
SUCCESS(2000, "操作成功"),
TOKEN_EXPIRED(4001, "您的token已过期"),
NOT_LOGIN(4002, "请先登录再进行访问"),
RESOURCES_NOT_FOUND(4003, "找不到相应资源"),
TOKEN_INVALID(4004, "无效的token"),
NO_AUTHORITY(4005, "对不起,您没有权限访问该接口"),
INCOMPLETE_PARAMETERS(4006, "请求字段不完整"),
UN_INIT(4007, "博客尚未初始化"),
INVALID_ID(4008, "你的id不合法"),
CHECK_USER_ERR(4009, "用户名或密码错误"),
UNKNOWN_ERROR(5000, "出现未知错误"),
FILE_UPLOAD_ERROR(5001, "图片上传失败"),
FILE_DOWNLOAD_ERROR(5002, "图片下载失败");
private Integer code;
private String msg;
BlogErrorInfoEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
}
GlobalExceptionhandler全局异常处理类
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(BlogException.class)
public BaseResult systemExceptionHandler(BlogException e){
//打印异常信息
log.error("出现了异常! {}",e);
//从异常对象中获取提示信息封装返回
return BaseResult.fail(e.getCode(),e.getMsg());
}
@ExceptionHandler(Exception.class)
public BaseResult exceptionHandler(Exception e){
//打印异常信息
log.error("出现了异常! {}",e);
//从异常对象中获取提示信息封装返回
return BaseResult.fail(BlogErrorInfoEnum.UNKNOWN_ERROR.getCode(),e.getMessage());
}
}
说在最后
安全申明:本人才疏学浅,若有任何谬误,欢迎指正