提示:这一篇文章,主要是为了之后可以快速的去搭建项目,当然这篇博客,作者也会根据以后学习到的东西,慢慢去整理
文章目录
前言
搭建一个SpringBoot项目,目的是为了快速开发项目
项目列表
响应枚举类
/**
* 响应码枚举类,用于定义系统中各种操作的返回码及其对应的信息。
*/
public enum ResponseCodeEnum {
// 请求成功
CODE_200(200, "请求成功"),
// 请求的资源不存在
CODE_404(404, "请求地址不存在"),
// 请求参数错误
CODE_600(600, "请求参数错误"),
// 信息已存在,通常用于数据重复的场景
CODE_601(601, "信息已经存在"),
// 服务器内部错误,需要管理员处理
CODE_500(500, "服务器返回错误,请联系管理员");
// 响应码
private Integer code;
// 响应信息
private String msg;
/**
* 构造方法,用于初始化枚举值。
* @param code 响应码
* @param msg 响应信息
*/
ResponseCodeEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 获取响应码。
* @return 响应码
*/
public Integer getCode() {
return code;
}
/**
* 获取响应信息。
* @return 响应信息
*/
public String getMsg() {
return msg;
}
}
响应数据包装类
/**
* 响应数据的通用包装类,用于封装接口调用的返回结果。
* <p>
* 该类提供了对响应状态、响应码、响应信息和响应数据的封装,适用于各种接口返回数据的统一格式化。
* 通过泛型T的支持,可以灵活地携带各种类型的响应数据。
*
* @param <T> 响应数据的类型,使用泛型提供类型安全性和灵活性。
*/
public class ResponseVO<T> {
/**
* 响应的状态,用于表示接口调用的总体状态,例如"success"表示成功。
*/
private String status;
/**
* 响应码,用于更详细地表示接口调用的结果状态,例如200表示成功。
*/
private Integer code;
/**
* 响应信息,用于对响应状态进行描述,例如"操作成功"。
*/
private String info;
/**
* 响应数据,接口调用的实际返回数据,其类型由泛型T指定。
*/
private T data;
/**
* 获取响应的状态。
*
* @return 响应的状态字符串。
*/
public String getStatus() {
return status;
}
/**
* 设置响应的状态。
*
* @param status 响应的状态字符串。
*/
public void setStatus(String status) {
this.status = status;
}
/**
* 获取响应码。
*
* @return 响应的码值。
*/
public Integer getCode() {
return code;
}
/**
* 设置响应码。
*
* @param code 响应的码值。
*/
public void setCode(Integer code) {
this.code = code;
}
/**
* 获取响应信息。
*
* @return 响应的信息字符串。
*/
public String getInfo() {
return info;
}
/**
* 设置响应信息。
*
* @param info 响应的信息字符串。
*/
public void setInfo(String info) {
this.info = info;
}
/**
* 获取响应数据。
*
* @return 响应的数据对象,其类型为泛型T。
*/
public T getData() {
return data;
}
/**
* 设置响应数据。
*
* @param data 响应的数据对象,其类型为泛型T。
*/
public void setData(T data) {
this.data = data;
}
}
异常类
/**
* 业务异常类,用于表示在业务逻辑执行过程中发生的异常情况。
* 继承自RuntimeException,因为它是一种非检查(Unchecked)异常,可以不强制在方法签名中声明。
* 这使得业务异常的使用更加灵活,能够更准确地反映业务逻辑中的错误情况。
*/
public class BusinessException extends RuntimeException {
/**
* 错误代码枚举,用于标准化错误代码和错误消息的映射。
*/
private ResponseCodeEnum codeEnum;
/**
* 错误代码,用于标识具体的错误类型。
*/
private Integer code;
/**
* 错误消息,用于描述错误的具体信息。
*/
private String message;
/**
* 带有错误消息和原因的构造函数。
*
* @param message 错误消息
* @param e 异常原因
*/
public BusinessException(String message, Throwable e) {
super(message, e);
this.message = message;
}
/**
* 带有错误消息的构造函数。
*
* @param message 错误消息
*/
public BusinessException(String message) {
super(message);
this.message = message;
}
/**
* 带有原因的构造函数。
*
* @param e 异常原因
*/
public BusinessException(Throwable e) {
super(e);
}
/**
* 使用错误代码枚举构造业务异常。
*
* @param codeEnum 错误代码枚举,包含错误代码、错误消息等信息。
*/
public BusinessException(ResponseCodeEnum codeEnum) {
super(codeEnum.getMsg());
this.codeEnum = codeEnum;
this.code = codeEnum.getCode();
this.message = codeEnum.getMsg();
}
/**
* 带有错误代码和错误消息的构造函数。
*
* @param code 错误代码
* @param message 错误消息
*/
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
this.message = message;
}
/**
* 获取错误代码枚举。
*
* @return 错误代码枚举
*/
public ResponseCodeEnum getCodeEnum() {
return codeEnum;
}
/**
* 获取错误代码。
*
* @return 错误代码
*/
public Integer getCode() {
return code;
}
/**
* 获取错误消息。
*
* @return 错误消息
*/
@Override
public String getMessage() {
return message;
}
/**
* 重写fillInStackTrace方法,返回当前异常实例。
* 业务异常中通常不需要堆栈跟踪信息,因此这个重写方法用于提高异常处理的性能。
*
* @return 当前异常实例
*/
/**
* 重写fillInStackTrace 业务异常不需要堆栈信息,提高效率.
*/
@Override
public Throwable fillInStackTrace() {
return this;
}
}
返回结果类
/**
* 基础控制器类,提供通用的响应构建方法。
*/
public class ABaseController {
/**
* 表示操作成功的状态码。
*/
protected static final String STATUC_SUCCESS = "success";
/**
* 表示操作失败或出现错误的状态码。
*/
protected static final String STATUC_ERROR = "error";
/**
* 日志记录器,用于记录控制器类的运行时日志。
*/
protected static final Logger logger = LoggerFactory.getLogger(ABaseController.class);
/**
* 构建一个表示操作成功的响应。
*
* @param t 返回的数据对象。
* @param <T> 数据对象的类型。
* @return 带有成功状态的响应对象。
*/
protected <T> ResponseVO getSuccessResponseVO(T t) {
ResponseVO<T> responseVO = new ResponseVO<>();
responseVO.setStatus(STATUC_SUCCESS);
responseVO.setCode(ResponseCodeEnum.CODE_200.getCode());
responseVO.setInfo(ResponseCodeEnum.CODE_200.getMsg());
responseVO.setData(t);
return responseVO;
}
/**
* 构建一个表示业务错误的响应。
*
* @param e 业务异常对象,包含错误代码和错误信息。
* @param t 返回的数据对象。
* @param <T> 数据对象的类型。
* @return 带有业务错误状态的响应对象。
*/
protected <T> ResponseVO getBusinessErrorResponseVO(BusinessException e, T t) {
ResponseVO vo = new ResponseVO();
vo.setStatus(STATUC_ERROR);
if (e.getCode() == null) {
vo.setCode(ResponseCodeEnum.CODE_600.getCode());
} else {
vo.setCode(e.getCode());
}
vo.setInfo(e.getMessage());
vo.setData(t);
return vo;
}
/**
* 构建一个表示服务器错误的响应。
*
* @param t 返回的数据对象。
* @param <T> 数据对象的类型。
* @return 带有服务器错误状态的响应对象。
*/
protected <T> ResponseVO getServerErrorResponseVO(T t) {
ResponseVO vo = new ResponseVO();
vo.setStatus(STATUC_ERROR);
vo.setCode(ResponseCodeEnum.CODE_500.getCode());
vo.setInfo(ResponseCodeEnum.CODE_500.getMsg());
vo.setData(t);
return vo;
}
}
异常处理器类
/**
* 全局异常处理控制器,继承自ABaseController,用于处理应用程序抛出的异常。
* 使用@RestControllerAdvice注解标识这是一个全局异常处理类。
*/
@RestControllerAdvice
public class AGlobalExceptionHandlerController extends ABaseController {
private static final Logger logger = LoggerFactory.getLogger(AGlobalExceptionHandlerController.class);
/**
* 处理所有类型的异常。
* @param e 抛出的异常对象。
* @param request HTTP请求对象,用于获取请求URL。
* @return 返回一个封装了异常信息的ResponseVO对象。
*/
@ExceptionHandler(value = Exception.class)
Object handleException(Exception e, HttpServletRequest request) {
// 记录异常信息到日志
logger.error("请求错误,请求地址{},错误信息:", request.getRequestURL(), e);
ResponseVO ajaxResponse = new ResponseVO();
// 根据不同的异常类型设置响应码和信息
// 404 - 请求未找到
if (e instanceof NoHandlerFoundException) {
ajaxResponse.setCode(ResponseCodeEnum.CODE_404.getCode());
ajaxResponse.setInfo(ResponseCodeEnum.CODE_404.getMsg());
ajaxResponse.setStatus(STATUC_ERROR);
} else if (e instanceof BusinessException) {
// 业务异常
// 业务错误
BusinessException biz = (BusinessException) e;
ajaxResponse.setCode(biz.getCode() == null ? ResponseCodeEnum.CODE_600.getCode() : biz.getCode());
ajaxResponse.setInfo(biz.getMessage());
ajaxResponse.setStatus(STATUC_ERROR);
} else if (e instanceof BindException || e instanceof MethodArgumentTypeMismatchException) {
// 参数绑定异常或参数类型不匹配异常
// 参数类型错误
ajaxResponse.setCode(ResponseCodeEnum.CODE_600.getCode());
ajaxResponse.setInfo(ResponseCodeEnum.CODE_600.getMsg());
ajaxResponse.setStatus(STATUC_ERROR);
} else if (e instanceof DuplicateKeyException) {
// 数据库主键重复异常
// 主键冲突
ajaxResponse.setCode(ResponseCodeEnum.CODE_601.getCode());
ajaxResponse.setInfo(ResponseCodeEnum.CODE_601.getMsg());
ajaxResponse.setStatus(STATUC_ERROR);
} else {
// 其他未指定的异常
ajaxResponse.setCode(ResponseCodeEnum.CODE_500.getCode());
ajaxResponse.setInfo(ResponseCodeEnum.CODE_500.getMsg());
ajaxResponse.setStatus(STATUC_ERROR);
}
return ajaxResponse;
}
}
测试类
@RestController
public class TestController extends ABaseController {
@RequestMapping("/test")
public ResponseVO test(){
throw new BusinessException("登陆密码错误");
}
}