企业级SpringBoot单体项目模板 —— 全局配置

news2024/11/18 19:46:06
  • 😜           :是江迪呀
  • ✒️本文关键词SpringBoot模版企业级
  • ☀️每日   一言你坚持下来了,而别人坚持不下来,这就是你的资本。

文章目录

  • 一、全局异常配置
    • 1.1 全局异常处理
    • 1.2 处理业务异常类
    • 1.3 状态码枚举类
    • 1.3 使用
  • 二、返回体配置
    • 2.1 返回体类
    • 2.2 抽象controller
    • 2.3 使用

上回我们创建了一个SpringBoot项目并且连接了数据库整合了MyBatis-plus框架。今天我们来添加一些公共的东西如:全局异常配置、返回体配置。

本次需要的依赖:

<dependency>
 <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.16.16</version>
</dependency>
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.75</version>
</dependency>

最终项目结构:

在这里插入图片描述

一、全局异常配置

在一个项目中我们常常需要处理一些业务异常,自定义一些状态码,SpringBoot框架中也有对应的方法供我们使用,但是为方便后续的扩展我们还是要自定义一个全局异常。

1.1 全局异常处理

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public Response businessExceptionHandler(HttpServletRequest request, BusinessException e){
        log.error("发生业务异常!原因是:{}",e.getErrorMsg());
        return Response.error(e.getErrorCode(),e.getErrorMsg());
    }

    /**
     * 处理空指针的异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =NullPointerException.class)
    @ResponseBody
    public Response exceptionHandler(HttpServletRequest req, NullPointerException e){
        log.error("发生空指针异常!原因是:",e);
        return Response.error(ResultEnum.BIZ_EXCEPTION.getValue());
    }

    /**
     * 处理其他异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =Exception.class)
    @ResponseBody
    public Response exceptionHandler(HttpServletRequest req, Exception e){
        log.error("系统异常!原因是:",e);
        return Response.error(ResultEnum.BIZ_EXCEPTION.getValue());
    }
}

  • @ExceptionHandler(value = BusinessException.class) 代码中的 value值就是 处理业务异常类

1.2 处理业务异常类

public class BusinessException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    /**
     * 错误码
     */
    protected String errorCode;
    /**
     * 错误信息
     */
    protected String errorMsg;

    public BusinessException() {
        super();
    }

    public BusinessException(String errorMsg) {
        super(errorMsg);
        this.errorMsg = errorMsg;
        this.errorCode = ResultEnum.FAILED.getCode();
    }

    public BusinessException(String errorCode, String errorMsg) {
        super(errorCode);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public BusinessException(String errorCode, String errorMsg, Throwable cause) {
        super(errorCode, cause);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }


    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public String getMessage() {
        return errorMsg;
    }

    @Override
    public Throwable fillInStackTrace() {
        return this;
    }

}

1.3 状态码枚举类

public enum ResultEnum {
    SUCCESS("0","执行成功"),
    FAILED("-1","执行失败"),
    BIZ_EXCEPTION("500","系统异常"),
    IDENTITY_IS_OVERDUE("1","身份过期"),
     //可以继续扩展定义
    ;
    private String code;
    private String value;

    ResultEnum(String code, String value) {
        this.code = code;
        this.value = value;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

注意:需要继承RuntimeException异常,因为我们处理的业务异常全部都是运行时异常。

1.3 使用

在需要抛出业务异常的地方:

//自定义提示信息
throw new BusinessException("发生了业务异常!");
//自定义状态码
throw new BusinessException("502","发生了业务异常!");
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
    @Override
    public List<UserVO> queryUserInfo() {
        int a = 1;
        if(a == 1){
            throw new BusinessException("502","发生了业务异常!");
        }
        return baseMapper.queryUserInfo();
    }
}

结果:
在这里插入图片描述

二、返回体配置

在上篇文章中我们在controller层返回的值直接是个集合:
在这里插入图片描述
这样是不符合规范的,我们需要定义一个含有code状态码、msg提示信息、data数据这三者的返回体。

2.1 返回体类

@Getter
@Setter
public class Response {
    /**
     * 响应码
     */
    private String code;

    /**
     * 响应消息
     */
    private String msg;

    /**
     * 响应结果
     */
    private Object result;

    /**
     * 成功
     *
     * @return
     */
    public static Response success() {
        return new Response(ResultEnum.SUCCESS.getCode(),ResultEnum.SUCCESS.getValue(),null);
    }
    /**
     * 成功
     *
     * @return
     */
    public static Response success(String msg) {
        return new Response(ResultEnum.SUCCESS.getCode(),msg,null);
    }
    public Response() {
    }
    public Response(String code, String msg, Object result) {
        this.code = code;
        this.msg = msg;
        this.result = result;
    }

    /**
     * 成功
     * @param data
     * @return
     */
    public static Response success(Object data) {
        Response rb = new Response();
        rb.setCode(ResultEnum.SUCCESS.getCode());
        rb.setMsg(ResultEnum.SUCCESS.getValue());
        rb.setResult(data);
        return rb;
    }

    /**
     * 失败
     */
    public static Response error(String code, String message) {
        Response rb = new Response();
        rb.setCode(code);
        rb.setMsg(message);
        rb.setResult(null);
        return rb;
    }

    /**
     * 失败
     */
    public static Response error(String message) {
        Response rb = new Response();
        rb.setCode(ResultEnum.FAILED.getCode());
        rb.setMsg(message);
        rb.setResult(null);
        return rb;
    }

    @Override
    public String toString() {
        return JSONObject.toJSONString(this);
    }
}

2.2 抽象controller

public abstract class AbstractController {
    public Response returnSuccess(){
        return Response.success();
    }
    public Response returnSuccess(Object data){
        return Response.success(data);
    }
    public Response returnSuccess(String msg){
        return Response.success(msg);
    }
}

我们需要每个controller都继承AbstractController

2.3 使用

@RestController
@RequestMapping("/user")
public class UserController extends AbstractController {
    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public Response users(){
        return returnSuccess(userService.queryUserInfo());
    }
}

测试:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并查集 size 的优化

我们把如下图所示的并查集&#xff0c;进行 union(4,9) 操作。 合并操作后的结构为&#xff1a; 可以发现&#xff0c;这个结构的树的层相对较高&#xff0c;若此时元素数量增多&#xff0c;这样产生的消耗就会相对较大。解决这个问题其实很简单&#xff0c;在进行具体指向操作…

【陕西理工大学-数学软件实训】数学实验报告(8)(数值微积分与方程数值求解)

目录 一、实验目的 二、实验要求 三、实验内容与结果 四、实验心得 一、实验目的 1. 掌握求数值导数和数值积分的方法。 2. 掌握代数方程数值求解的方法。 3. 掌握常微分方程数值求解的方法。 二、实验要求 1. 根据实验内容&#xff0c;编写相应的MATLAB程序&#xff0c…

Java IO 之 BIO、NIO 和 AIO

一、IO IO 是 Input 和 Output 二词的缩写&#xff0c;意为输入和输出&#xff0c;直接来说&#xff0c;实现一般的 I/O 是没有什么难度的&#xff0c;但涉及到多线程时&#xff0c;要解决 I/O 的问题就不是一个简单的事情了&#xff0c;会涉及到同步和异步的问题&#xff0c;…

SSL加速是什么,有什么优势?

SSL加速技术是一种专门用于加速HTTPS通信的技术&#xff0c;它可以在服务器和客户端之间提供高效的加密和解密处理&#xff0c;以提升网络通信的安全性和性能。以下是SSL加速技术的一些主要优势&#xff1a; 提高网站的访问速度&#xff1a;SSL加速技术可以对SSL握手过程进行优…

1143. 最长公共子序列(C++实现)

1143. 最长公共子序列https://leetcode.cn/problems/longest-common-subsequence/ int longestCommonSubsequence(string text1, string text2) {int m text1.size(), n text2.size();vector<vector<int>> dp(m 1, vector<int>(n 1));for (int i 0; i …

C++文件操作示例

C 标准库提供了 3 个类用于实现文件操作&#xff0c;它们统称为文件流类&#xff0c;这 3 个类分别为&#xff1a; ifstream&#xff1a;专用于从文件读取数据 ofstream&#xff1a;专用于向文件写入数据 fstream&#xff1a;可读可写 这三个文件流类都位于 fstrea…

NSS [HNCTF 2022 WEEK2]easy_sql

NSS [HNCTF 2022 WEEK2]easy_sql 这题考察了无列名注入&#xff0c;首先了解一下什么是无列名注入再开始做题吧。 为什么会需要无列名注入&#xff1f; 我们常用的SQL注入方法是通过information_schema这个默认数据库来实现&#xff0c;可是你有没有想过&#xff0c;如果过滤…

下载github中单独某个子文件方法

在github中下载文件有很多方法&#xff0c;比如整体打包下载&#xff0c;单独小文件下载。我分享一个怎样下载某个单独文件夹方法。 在下载这个E文件夹时候&#xff0c;复制当前的url。 然后找到一个工具网页&#xff1a;DownGit 然后就可以下载文件夹的压缩文件了。

【机器学习】TF-IDF以及TfidfVectorizer

TF-IDF定义 TF-IDF&#xff1a; 全称为"词频一逆文档频率"。   TF&#xff1a;某一给定词语在该文档中出现的频率。 T F w 词语 w 在该文档中个数 该文档内总词个数 TF_w \frac{词语w在该文档中个数}{该文档内总词个数} TFw​该文档内总词个数词语w在该文档中个…

FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX SIP中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关端口组呼入号码7、设置FXO网关的SIP中继8、设置FXO网关呼叫…

第二章 进程与线程 十、调度算法1(先来先服务、短作业优先、最高响应比优先)

目录 一、先来先服务算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺点 优点&#xff1a; 缺点&#xff1a; 6、是否会导致饥饿 7、例子 二、短作业优先算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺…

Linux多线程【线程控制】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、线程知识补充1.2、线程私有资源1.3、线程共享资源1.4、原生线程库 2、线程…

FreeSWITCH 1.10.10 简单图形化界面8 - 讯时FXO网关SIP注册公网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面8 - 讯时FXO网关SIP注册公网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX 分机中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关中继线路呼入号码7、设置FXO网关呼叫路由&#xff08;呼入…

为啥我的第二个for循环不加框红的代码就运行失效呢?(文末赠书)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 苟全性命于乱世&#xff0c;不求闻达于诸侯。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【哎呦喂 是豆子&#xff5e;】问了一…

【机组】计算机系统组成课程笔记 第二章 计算机中的信息表示

2.1 无符号数和有符号数 2.1.1 无符号数 没有符号的数&#xff0c;其实就是非负数。在计算机中用字节码表示&#xff0c;目前最常用的是八位和十六位的。 2.1.2 有符号数 将正负符号数字化&#xff0c;0代表 &#xff0c;1代表 - &#xff0c;并把代表符号的数字放在有效数…

【Linux升级之路】6_进程间通信

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux升级之路】 ✒️✒️本篇内容&#xff1a;进程间通信介绍&#xff0c;管道&#xff0c;共享内存&#xff0c;消息队列&#xff0c;信号量 &#x1f…

八股文学习一(存储)

一. 存储 行式存储的原理与特点 对于 OLAP 场景&#xff0c;大多都是对一整行记录进行增删改查操作的&#xff0c;那么行式存储采用以行的行式在磁盘上存储数据就是一个不错的选择。 当查询基于需求字段查询和返回结果时&#xff0c;由于这些字段都埋藏在各行数据中&#xf…

直播设备之ENC1高级篇拆机刷uboot教程

直播设备之ENC1高级篇拆机刷uboot教程 第一步&#xff1a; 准备材料第二步&#xff1a;拆外壳取出裸板第三步&#xff1a;链接串口线第四步&#xff1a;进入电脑&#xff0c;开始刷uboot第五步&#xff1a;开始刷设备固件 老铁们好&#xff0c;好久没出文章了&#xff0c;这两天…

【面试题】智力题

文章目录 腾讯1000瓶毒药里面只有1瓶是有毒的&#xff0c;问需要多少只老鼠才能在24小时后试出那瓶有毒。有两根不规则的绳子&#xff0c;两根绳子从头烧到尾均需要一个小时&#xff0c;现在有一个45分钟的比赛&#xff0c;裁判员忘记带计时器&#xff0c;你能否通过烧绳子的方…

leetcode21合并两个有序链表

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…