SpringBoot创建一个初始化项目

提示:这一篇文章,主要是为了之后可以快速的去搭建项目,当然这篇博客,作者也会根据以后学习到的东西,慢慢去整理

文章目录


前言

搭建一个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("登陆密码错误");
    }
}

响应结果

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值