提示:这一篇文章,主要是为了之后可以快速的去搭建项目,当然这篇博客,作者也会根据以后学习到的东西,慢慢去整理
文章目录
前言
搭建一个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 错误消息*/@Overridepublic String getMessage() {return message;}/*** 重写fillInStackTrace方法,返回当前异常实例。* 业务异常中通常不需要堆栈跟踪信息,因此这个重写方法用于提高异常处理的性能。* * @return 当前异常实例*//*** 重写fillInStackTrace 业务异常不需要堆栈信息,提高效率.*/@Overridepublic 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("登陆密码错误");}
}